【发布时间】:2015-12-01 10:34:19
【问题描述】:
我需要实现一个for_each 函数,如下所示。我知道std::for_each 可以将fn 应用于每个元素,但我们不能擦除std::for_each 中的元素。我需要扩展这个模板函数,以便在fn 中,调用者可以一次访问元素和擦除元素。有没有合适的方法来做到这一点?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class A
{
public:
explicit A(){
mVec.clear();
}
~A(){}
template<class T> void for_each(T fn)
{
for(size_t i = 0; i < mVec.size(); ++i)
{
//fn can erase element or just visit element
fn(mVec[i]);
}
}
vector<int> mVec;
};
int main()
{
A test;
for(int i = 0; i < 8; ++i)
{
test.mVec.push_back(i);
}
test.for_each([&test](int i){
if (i % 2 == 0)
{
cout << i << " deleted" << endl;
test.mVec.erase(find(test.mVec.begin(), test.mVec.end(), i));
}
else
{
cout << i << " parse" << endl;
}
});
system("pause");
return 0;
}
编辑:在for_each 模板函数中,我们不知道调用者是否会擦除元素。擦除元素是在fn
【问题讨论】:
-
试试
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i){ return i%2==0;}), vec.end());? -
使用
std::remove_if。另请参阅“remove-erase idiom”。 -
阅读this,了解如何正确地从向量中删除项目。
-
这个线程很有趣且相关,关于为什么元素在 foreach 中是不可变的。不要被主题中的升c 所迷惑——它实际上是关于foreach 的设计,并且不管实现语言如何都很有趣。 stackoverflow.com/questions/776430/…
标签: c++ vector stl-algorithm