2014-04-14 93 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) –