在改变循环的同时进行迭接通常很困难。
因此,有一个特定的 C++ 语系可用于非联合序列: 擦去- 移动音系。
它将使用 remove_if
算法与 erase
方法的范围超载结合起来:
myQueue.erase(
std::remove_if(myQueue.begin(), myQueue.end(), /* predicate */),
myQueue.end());
以典型的授粉对象表示或使用新的C++11 羊羔语法表示上游。
// Functor
struct OddKey {
bool operator()(std::pair<int, int> const& p) const {
return p.first % 2 != 0;
}
};
/* predicate */ = OddKey()
// Lambda
/* predicate */ = [](std::pair<int, int> const& p) { return p.first % 2 != 0; }
羊羔形式更简洁,但可能少一些自制文件(无名),并且只有C++11版。根据你的口味和限制,请选择最适合你的文件。
可以提升你的写法:使用Boost.Range 。
typedef std::vector< std::pair<int, int> > PairVector;
void pass(PairVector& pv) {
auto const filter = [](std::pair<int, int> const& p) {
return p.first % 2 != 0;
};
auto const transformer = [](std::pair<int, int> const& p) {
return std::make_pair(p.first, p.second / 2);
};
pv.erase(
boost::transform(pv | boost::adaptors::filtered( filter ),
std::back_inserter(pv),
transformer),
pv.end()
);
}
http://www.boost.org/doc/libs/1_49_0/libs/range/doc/range/doc/range/range/refer/algorithms/mutate/transform.html" rel=“nofolpt”_code> transform 和code> filtered accessor ,以及许多其他文件。