我有两个 vector
vector<int> vint;
vector<vector<int>::iterator> viter;
什么是删除 vint
中其迭代器出现在 viter
中的所有元素的最佳方法。目前,我临时移动到 list
编辑:(更多背景)
这是我当前的代码。我希望我可以避免移动到列表并返回到 vector
void foo(std::vector<Blah>& bvec)
{
std::list<Blah> blist;
std::move(bvec.begin(), bvec.end(), std::back_inserter(blist));
bvec.clear();
std::vector<std::list<Blah>::iterator> selectedElements;
{
//Critical section which holds a mutex. Should be as fast as possible
for(auto it = blist.begin(), it_end= blist.end(); it != it_end; ++it)
{
if(shouldElementBeRemoved(*it))
selectedElements.push_back(it);
}
}
for(auto& it: selectedElements)
{
if(shouldElementReallyBeRemoved(*it))
blist.erase(it);
}
std::move(blist.begin(), blist.end(), std::back_inserter(bvec));
}
如果我可以直接从 vector 中删除,则可以在没有列表的情况下进行简化。
void foo(std::vector<Blah>& bvec)
{
std::vector<std::vector<Blah>::iterator> selectedElements;
{
//Critical section which holds a mutex. Should be as fast as possible
for(auto it = bvec.begin(), it_end= bvec.end(); it != it_end; ++it)
{
if(shouldElementBeRemoved(*it))
selectedElements.push_back(it);
}
}
for(auto& it: selectedElements)
{
if(shouldElementReallyBeRemoved(*it))
// bvect.erase(it); //Not safe!
}
}
最佳答案
您应该能够使用您的第二个代码段并稍加修改 - 而不是向前迭代 selectedElements
,而是向后。然后调用 bvec.erase
将永远不会使保留在 selectedElements
中的任何迭代器失效。
void foo(std::vector<Blah>& bvec)
{
std::vector<std::vector<Blah>::iterator> selectedElements;
selectedElements.reserve(bvec.size()); // avoid growing the vector while you hold a mutex lock
{
//Critical section which holds a mutex. Should be as fast as possible
for(auto it = bvec.begin(), it_end= bvec.end(); it != it_end; ++it)
{
if(shouldElementBeRemoved(*it))
selectedElements.push_back(it);
}
}
for(auto first = selectedElements.rbegin(),
last = selectedElements.rend();
first != last;
++first)
{
if(shouldElementReallyBeRemoved(**first))
bvec.erase(*first);
}
}
关于c++ - 给定另一个迭代器 vector ,如何从 vector 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614099/