我想做类似的事情:
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 :(得分: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
,以便简单介绍这个想法。我将.erase
,std::remove_if
和std::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;
}