从std :: vector中的特定索引中删除

Mis*_*tyD 3 c++ vector

假设我有一个带有5个元素的std :: vector,我需要删除索引1和3中的元素,这是最快的方法.标准库中是否有任何帮助方法可以为我执行此操作?

mat*_*975 7

你可以使用这个erase功能.对于这个特定情况,你提到这样的事情:

myvector.erase (myvector.begin()+3);
myvector.erase (myvector.begin()+1);
Run Code Online (Sandbox Code Playgroud)

会做的.你必须为erase函数提供一个迭代器,我建议你阅读它的使用文档.以上内容适用于您的情况.请注意,每次调用擦除都会更改删除位置后剩余元素的索引,但内部数组元素将相对于删除的项目进行调整.

在回复您的注释时,您一次只能擦除一个元素,除非它们是连续的索引,在这种情况下,您可以使用基于范围的擦除版本作为开始和结束迭代器.例如,如果要删除索引1,2和3使用

myvector.erase (myvector.begin()+1,myvector.begin()+4);
Run Code Online (Sandbox Code Playgroud)

正如我已经提到的那样,在您擦除的项目之后的项目索引将相应地降档.这是不可避免的,因为数组中不能有"间隙".

  • @MistyD然后你擦除5然后3然后1.只有擦除一个后的索引会受影响,所以按反向索引顺序. (5认同)

Joa*_*son 6

这应该是一个相当有效的实现,使用std::move并且每次只移动每个元素一次.它要求索引删除to_remove以进行排序.

template<typename T>
  void remove_index(std::vector<T>& vector, const std::vector<int>& to_remove)
  {
    auto vector_base = vector.begin();
    std::vector<T>::size_type down_by = 0;

    for (auto iter = to_remove.cbegin(); 
              iter < to_remove.cend(); 
              iter++, down_by++)
    {
      std::vector<T>::size_type next = (iter + 1 == to_remove.cend() 
                                        ? vector.size() 
                                        : *(iter + 1));

      std::move(vector_base + *iter + 1, 
                vector_base + next, 
                vector_base + *iter - down_by);
    }
    vector.resize(vector.size() - to_remove.size());
  }

// Usage:
//
// std::vector<std::string> values = { "0", "1", "2", "3", "4", "5"};
// remove_index(values, { 1, 3 });
Run Code Online (Sandbox Code Playgroud)