6

このコードが機能する理由を教えてください。replace_ifアルゴリズムによって使用されるオーバーロードされた operator() があります。メイン関数では、 IsEqual クラスの定数オブジェクトを作成したので、定数関数メンバーのみを使用する必要があります。どういうわけか恒常性が機能せず、そのオペレーターが呼び出されます。

#include <iostream>
#include <vector>
#include <algorithm>

class IsEqual {
    int value;
public:
    IsEqual(int v) : value(v) {}
    bool operator()(const int &elem){
    this->value=6;
    return elem == value;
    }
};

int main()
{
    const IsEqual tst(2);
    std::vector<int> vec = {3,2,1,4,3,7,8,6};
    std::replace_if(vec.begin(), vec.end(), tst, 5);
    for (int i : vec) std::cout << i << " ";
    std::cout<<std::endl;
}

結果: 3 2 1 4 3 7 8 5

4

1 に答える 1

11

std::replace_ifオブジェクトの独自のコピーを作成しtstます。に制限する必要はありませんconst

アルゴリズムで元のオブジェクトを使用する場合は、std::reference_wrapper. オブジェクトを参照するconstため、演算子が次のようになる必要があるため、コンパイラ エラーが発生しますconst

std::replace_if(vec.begin(), vec.end(), std::ref(tst), 5);
于 2015-06-29T14:05:29.367 に答える