2014-11-05 50 views
0

我想要删除元素,如果它的值与字符串“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"); 

所以如何实现在更复杂?

+1

看[删除,删除成语(http://en.wikipedia.org/wiki/Erase-remove_idiom) – Jarod42 2014-11-05 10:45:50

回答

2

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

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

没必要用'的std :: remove_if'和拉姆达在这里,为什么不干脆用“std :: remove”的值为“空”'? – Snps 2014-11-05 15:00:36

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来清除它们。