将迭代器存储在临时容器中,然后将其从其他容器中删除

时间:2013-11-26 13:31:24

标签: c++ iterator erase

我想做类似的事情:

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上标记的元素。

我该怎么做?我需要标记元素以便以后删除。

2 个答案:

答案 0 :(得分:1)

你需要从最后一个迭代器循环到第一个迭代器,因为当你擦除一个向量中的一个元素时,所有迭代器都会超过你删除的那个迭代器。

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);

答案 1 :(得分: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;
}