13

我创建了一个函数来遍历字符串向量,并删除任何长度小于等于3的字符串。这是使用STL算法库的一节课。

我遇到的问题是,函数可以工作,但它不仅删除长度为3或更短的字符串,而且还将字符串“vector”附加到末尾。

输出应为

此测试向量

相反,它是

该测试向量“

我怎样才能修好它?

/**使用remove_if和自定义回调函数,编写RemoveShortWords*接受向量<string>并删除所有长度为3或*在函数中使用两行代码。*/#包括<iostream>#包括<string>#包含<算法>#包含<矢量>#包含<迭代器>使用命名空间标准;bool StringLengthTest(字符串测试)//remove_if algo的测试条件。{返回test.length()<=3;}void RemoveShortWords(vector<string>&myVector){//擦除长度<=3的向量中的任何内容myVector.erase(remove_if(myVector.begin(),myVector.end(),弦长测试);}int main(){//向向量添加一些字符串vector<string>myVector;myVector.push_back(“本”);myVector.push_back(“是”);myVector.push_back(“a”);myVector.push_back(“测试”);myVector.push_back(“向量”);//打印myVector的内容(调试)复制(myVector.begin()、myVector.end()、ostream_iterator<string>(cout,“”));cout<<endl//冲洗溪流删除短词(myVector)//删除长度<=3的单词//打印myVector(调试)复制(myVector.begin(),myVector.end(),ostream_iterator<string>(cout,“”));cout<<endl;系统(“暂停”);返回0;}

2个答案2

重置为默认值
31

如果将这些陈述分开,最容易理解:

自动iter(remove_if(myVector.begin(),myVector.end(),StringLengthTest));myVector.erase(iter);

这两行与您的单行相同。现在应该清楚“bug”是什么了。remove_if首先工作。它遍历整个向量,并将所有“选定”条目“移到末尾”(更好的说法是:它将未选定的条目移到前面)。运行后,它将迭代器返回到遗留条目的“最后”位置,类似于:


测试
矢量
测试<-迭代器指向此处
矢量

然后使用单个迭代器运行erase。这意味着您删除了指向的单个元素-因此您删除了“test”元素剩下的就是你所看到的。

要修复它,只需从remove_if返回到end()的向量中擦除。:

myVector.erase(remove_if(myVector.begin(),myVector.exe(),StringLengthTest),myVector.end())//擦除长度<=3的向量中的任何内容
2
  • 细节很棒。非常感谢您澄清发生了什么!
    – MCP公司
    评论 2012年1月29日14:50
  • 如果我的矢量都是空的。然后iter公司将等于myVector.end(),并使用擦除擦除(iter)将导致UB。
    – 鲁斯兰
    评论 2015年8月7日8:48
12

您应该使用擦除的两个参数形式:

myVector.erase(remove_if(myVector.begin(),myVector.exe(),StringLengthTest),myVector.end());
0

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.