c++ - 给定另一个迭代器 vector ,如何从 vector 中删除元素

标签 c++ c++11 stdvector

我有两个 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);
  }
}

Live demo

关于c++ - 给定另一个迭代器 vector ,如何从 vector 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28614099/

相关文章:

c++ - 四倍精度的 Epsilon (gcc)

c++ - 如何将带有 "any"枚举的 std::map 传递给函数

c++ - 模板的静态成员

C++ std::vector::clear() 崩溃

python - 通过 Cython(回调)将 Python 函数应用于 std::vector

c++ - `std::vector< std::unique_ptr< T >>` 错误

杀死后C++线程还活着吗?

c++ - Boost::spirit::karma:复制在 repeat 或 kleene star 中不起作用?

c++ - 为什么 std::move 对 std::unique_lock 没有任何影响?

c++ - std::bind 与 lambda 的效率