我想删除元素,如果它的值与字符串“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");
那么如何以更低的复杂度实现它呢?
答案 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());
remove_if
将所有找到的"empty"
放在vector
的末尾。iterator
删除它们。