从矢量范围中删除特定元素

时间:2014-11-05 10:23:32

标签: c++ vector stl stdvector

我想删除元素,如果它的值与字符串“empty”匹配,那么迭代彻底循环,但它不会那样工作。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main ()
{
  std::vector<std::string> myvector;

  myvector.push_back("value");
  myvector.push_back("value");
  myvector.push_back("empty");
  myvector.push_back("value");
  myvector.push_back("value");
  myvector.push_back("empty");
  myvector.push_back("empty");

  int index = 0;
  for(string input: myvector){
    if(input == "empty")
        myvector.erase(myvector.begin()+index,myvector.begin()+index);
    index++;
  }

  for(string input: myvector){
    cout << input << endl;
  }
  return 0;
}

但我们可以看到没有删除任何内容? 输出:

value
value
empty
value
value
empty
empty

寻找类似下面但不存在的内容

myvector.erase(myvector.begin(),myvector.end(),"empty"); 

那么如何以更低的复杂度实现它呢?

2 个答案:

答案 0 :(得分:2)

你应该像这样使用std :: remove_if:

myvector.erase(std::remove_if(myvector.begin(), myvector.end(), [](const std::string& string){ return (string == "empty"); }), myvector.end());

答案 1 :(得分:2)

    std::vector<std::string> myvector;
    myvector.push_back("value");
    myvector.push_back("value");
    myvector.push_back("empty");
    myvector.push_back("value");
    myvector.push_back("value");
    myvector.push_back("empty");
    myvector.push_back("empty");
    auto it = std::remove_if(myvector.begin(), myvector.end(), 
    [](const std::string& s)
    { 
        return (s== "empty"); 
    });
    myvector.erase(it, myvector.end());
  1. 使用remove_if将所有找到的"empty"放在vector的末尾。
  2. 使用返回的iterator删除它们。