从向量中擦除,使用 lambda 函数和函数对象给出不同的结果。
我正在尝试从字符串向量中删除第三个元素。使用函数对象的第 3 和第 6 个元素被删除,但使用 lambda 版本,代码给出了预期的结果。
我尝试了以下代码:
#include <iostream>
#include<algorithm>
#include<iterator>
#include<vector>
using namespace std;
int main()
{
vector<string> s;
copy(istream_iterator<string>(cin),
istream_iterator<string>(),
back_inserter(s));
cout<<"S contains :"<<endl;
for(auto x:s)
cout<<x<<" ";
cout<<endl;
#ifndef USE_LAMBDA
struct Word_No{
int word_ith;
int word_count;
Word_No(int x) :word_ith(x),word_count(0){}
bool operator () (string){
return ++word_count == word_ith;
}
};
//3rd Element remove
s.erase(remove_if(s.begin(),s.end(),Word_No(3)),s.end());
#else
int count =0;
s.erase(remove_if(s.begin(),
s.end(),
[&count](string){
return ++count ==3; //3rd Element Remove
}),
s.end());
#endif
cout<<"Now S contains :"<<endl;
for(auto x:s)
cout<<x<<" ";
}
结果:
g++ -o 测试 test.cpp -std=gnu++0x
输入: 王后 杰克 Ace Rook Knight Pawn Bishop
输出:
S 包含 : King Queen Jack Ace Rook Knight Pawn Bishop
现在 S 包含:King Queen Ace Rook Pawn Bishop //错误的结果 3 和第 6 个元素已删除。
g++ -o 测试 test.cpp -std=gnu++0x -DUSE_LAMBDA
输入: 王后 杰克 Ace Rook Knight Pawn Bishop
S 包含 : King Queen Jack Ace Rook Knight Pawn Bishop
现在 S 包含:King Queen Ace Rook Knight Pawn Bishop // 正确结果
谁能解释一下这两种行为?