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

Store iterators on a temp container and then remove them from other container

本文关键字:其他 删除 然后 存储 迭代器      更新时间:2023-10-16

我想做一些类似的事情:

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

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

您需要从最后一个迭代器循环到第一个,因为当您擦除向量中的元素时,所有超过您删除的迭代器的迭代程序都将无效。

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

尝试一下,我将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;
}