2014-04-14 57 views
1

我试图做一个条件增加过程中添加元素:怎样的for_each

std::for_each(foos.begin(), foos.end(),[&](Foo p){ 
    if (p.passesSomeTest()){ 
     p.change(); 
     foos.push_back(p); 
    } 
}); 

基本上,我有元素的列表,并使用这些元素,如果他们符合一定的条件下,我想创建它们的副本,稍微修改它,然后将其添加到相同的列表中。

我不需要我的for_each来检查新添加的元素。

有什么办法可以使用stl来做到这一点吗?

+1

这是不明智的,而你是遍历它来修改向量。 'push_back'可能会使所有迭代器失效。我现在懒得仔细研究这个标准,但如果你的代码没有表现出未定义的行为,我会感到惊讶。 –

+0

当你在循环中使用它时,修改容器的想法不好。因为如果你修改列表你的迭代器变得不正确。 – Guinness

+1

就我个人而言,我只是基于索引而不是迭代器的手写循环。 –

回答

1

使用的临时列表,使其更容易

std::for_each(foos.begin(), foos.end(),[&](Foo p){ 
    if (p.passesSomeTest()){ 
     p.change(); 
     foos2.push_back(p); // insert to temporary foos2 list 
    } 
}); 

foos.insert(foos.end(), foos2.begin(), foos2.end()); // insert temporary list to foos 
+0

使用[splice](http://en.cppreference.com/w/cpp/container/list/splice)可避免每个元素的复制。 (1) –