ベクトルから消去すると、ラムダ関数と関数オブジェクトで異なる結果が得られます。
文字列のベクトルから 3 番目の要素を削除しようとしています。関数オブジェクトでは 3 番目と 6 番目の要素が削除されますが、ラムダ バージョンではコードが期待どおりの結果をもたらします。
次のコードを試しました:
#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
入力: キング クイーン ジャック エース ルーク ナイト ポーン ビショップ
出力:
S : キング クイーン ジャック エース ルーク ナイト ポーン ビショップ
現在、S には : キング クイーン エース ルーク ポーン ビショップ//間違った結果 3 と 6 番目の要素が削除されました。
g++ -o test test.cpp -std=gnu++0x -DUSE_LAMBDA
入力: キング クイーン ジャック エース ルーク ナイト ポーン ビショップ
S : キング クイーン ジャック エース ルーク ナイト ポーン ビショップ
現在 S には : キング クイーン エース ルーク ナイト ポーン ビショップ // 正しい結果が含まれています
誰でもこれら2つの動作を説明できますか?