我创建了一个函数来运行字符串向量并删除任何长度为3或更小的字符串。这是使用STL算法库的一课。
我遇到麻烦,因为这些函数有效但不仅删除长度为3或更短的字符串,而且还将字符串“vector”附加到结尾。
输出应为
This test vector
而不是
This test vector vector"
我该如何解决?
/*
* using remove_if and custom call back function, write RemoveShortWords
* that accepts a vector<string> and removes all strings of length 3 or
* less from it. *shoot for 2 lines of code in functions.
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
bool StringLengthTest(string test) //test condition for remove_if algo.
{
return test.length() <= 3;
}
void RemoveShortWords(vector<string> &myVector)
{
//erase anything in vector with length <= 3
myVector.erase(remove_if(myVector.begin(),
myVector.end(),
StringLengthTest));
}
int main ()
{
//add some strings to vector
vector<string> myVector;
myVector.push_back("This");
myVector.push_back("is");
myVector.push_back("a");
myVector.push_back("test");
myVector.push_back("vector");
//print out contents of myVector (debugging)
copy(myVector.begin(), myVector.end(), ostream_iterator<string>(cout," "));
cout << endl; //flush the stream
RemoveShortWords(myVector); //remove words with length <= 3
//print out myVector (debugging)
copy(myVector.begin(), myVector.end(), ostream_iterator<string>(cout," "));
cout << endl;
system("pause");
return 0;
}
答案 0 :(得分:28)
如果你单独陈述,最容易理解这一点:
auto iter(remove_if(myVector.begin(), myVector.end(), StringLengthTest));
myVector.erase(iter);
这两行与您的单行相同。现在应该清楚“虫子”是什么。 remove_if,首先工作。它迭代整个向量并将所有“选定”条目“移动到最后”(更好地说:它将未选择的条目移动到前面)。运行后,它会将迭代器返回到左侧条目的“最后”位置,如:
此
测试
矢量
测试&lt; - 迭代器点在这里
向量
然后用单个迭代器运行擦除。这意味着你擦除指向的单个元素 - 所以你擦除了“test”元素。 - 剩下的就是你所看到的。
要修复它,只需从remove_if返回的向量擦除到end()。:
myVector.erase(remove_if(myVector.begin(), myVector.end(), StringLengthTest), myVector.end()); //erase anything in vector with length <= 3
答案 1 :(得分:11)
您应该使用擦除的两个参数形式:
myVector.erase(remove_if(myVector.begin(), myVector.end(), StringLengthTest),
myVector.end());