2013-11-26 71 views
0

刪除他們,我想要做的事,如:商店迭代器從其他容器

std::vector<Class*> myVector; 
std::vector<Class*> tempvector; 
// Fill myVector 

for (std::vector<Class*>::iterator it = myVector.begin(); it != myVector.end(); ++it) 
    if (some condition) 
     tempvector.push_back(it*); 

for (std::vector<Class*>::iterator it = tmpvector.begin(); it != tmpvector.end(); ++it) 
    myVector.erase(it); 

即我填myVector,則迭代,標誌着去除一些元素,並儲存在一個時間矢量,然後迭代時間矢量並刪除myVector上的標記元素。

我該怎麼做?我需要將這些元素標記爲以後刪除。

回答

0

你需要從最後一個迭代器循環到第一個迭代器,因爲當你刪除一個向量中的一個元素時,所有迭代器都會被刪除。

std::vector<Class*> myVector; 
std::vector<std::vector<Class*>::iterator> tempvector; 
// Fill myVector 

for (std::vector<Class*>::iterator it = myVector.begin(); it != myVector.end(); ++it) 
    if (some condition) 
     tempvector.push_back(it); 

for (std::vector<std::vector<Class*>::iterator>::iterator it = tmpvector.end(); it != tmpvector.begin(); --it) 
    myVector.erase(*it); 
+0

刪除此評論 – smc

+0

發佈您的代碼和編譯器錯誤 – Drax

+0

抱歉,這是我的壞 – smc

0

試試這個,我改變Class*int,使其簡單介紹的想法。我混,.erasestd::remove_ifstd::find在一起:

std::vector<int> myVector; 
std::vector<int> toRemove; 

for (std::vector<int>::iterator it=myVector.begin(); it != myVector.end(); ++it) 
    if (...condition...) 
     toRemove.push_back(*it); 

myVector.erase(std::remove_if(myVector.begin(), myVector.end(), 
    [&toRemove](int x) 
    { 
     return std::find(toRemove.begin(), toRemove.end(), x) != toRemove.end(); 
    }), myVector.end()); 

for (std::vector<int>::iterator it=myVector.begin(); it!=myVector.end();) 
{ 
    if(std::find(toRemove.begin(), toRemove.end(), x) != toRemove.end()) 
     it = myVector.erase(it); 
    else 
     ++it; 
} 
+0

第一個解決方案工作正常,但它不是很有效,當你必須做很多次:/第二個,不適合我,也許我宣佈'x '錯了。 – smc