在修改循環時迭代通常很棘手。
因此,有一個特定的C++習慣用法可用於非關聯序列:擦除刪除習慣用法。
它結合了erase
方法的範圍過載使用remove_if
算法:
myQueue.erase(
std::remove_if(myQueue.begin(), myQueue.end(), /* predicate */),
myQueue.end());
其中謂詞表達爲一個典型的函子對象或使用新的C++ 11 lambda語法。
// 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; }
lambda表單更簡潔,但可能更少自我記錄(無名稱),並且僅在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()
);
}
你可以找到transform
和文檔中的filtered
adaptor,其他許多人。
而問題是......? – ScarletAmaranth
這個問題很難理解。你可以重新說明嗎? – juanchopanza
問題只是缺少問號。最後一行。 – Nick