1

現在、次のような STL コンテナー内の各要素を呼び出す for ループを実行しています。

void AddToUpdate(iterator iter, Update& Update) {...};

...

Update update;
for(iterator iter = container.begin(); iter != container.end(); ++iter)
    AddToUpdate(iter, update);

私のニーズに合っているように見えるので、for_each STLアルゴリズムを見ています。

コンテナーに適用される関数に 2 番目の入力パラメーターを使用する場合、これをリファクタリングして、メンバー変数やその他の抜け穴を使用せずに標準の STL アルゴリズムを使用できるかどうか疑問に思っていました。

4

2 に答える 2

4

使用したい std::bind2nd()- http://www.cplusplus.com/reference/std/functional/bind2nd/

基本的に、2 番目の引数が固定されている 2 つの引数を持つ関数から単項関数オブジェクトを返します。

と を使用すると、コードは次のようにfor_eachなりbind2ndます。

Update update;
for_each(container.begin(), container.end(), bind2nd(ptr_fun(AddToUpdate), update));

編集。Matteo が気付いたように、 の最初の引数はAddToUpdateイテレータではなく、コンテナ内の値の型でなければなりません。

于 2010-12-15T22:50:42.973 に答える
4

さまざまなstd::bind1st/std::bind2ndおよびBoost.bindライブラリは、問題を解決するために作成されました (これは、STL アルゴリズムを使用したほとんどすべての人に共通しています) が、多くの場合、解決策ではなく回避策のように見えます。

幸いなことに、間もなく登場する C++ 標準では、待望のラムダ関数の追加により、問題が確実に解決されるはずです。ただし、std::for_each逆参照されたイテレータ (つまり、考慮される実際の値) を渡してファンクタを呼び出すため、AddToUpdate関数はイテレータではなく値を受け入れる必要があることに注意してください。

そのような場合は、次のようになります。

Update update;
std::foreach(container.begin(); container.end(); [ & update](TypeOfTheValue Value) {
    AddToUpdate(Value, update);
});
于 2010-12-15T22:57:40.857 に答える