1

現在、頭を悩ませていることがあります。各要素が 1 ずつ増加する出力を期待していましたが、明らかにそうではありません。

よく見てみると、bind2nd 関数の戻り値が破棄されているためだと思います。つまり、関数はコンテナーの要素を変更しません。

私の考えは正しいですか?コンテナーが変更されていないことについて、誰かが確認または正しい説明を提供できますか?

#include <vector>
#include <iostream>
#include <algorithm>
#include <functional> using namespace std; void printer(int i) {
        cout << i << ", "; } int main() {
        int mynumbers[] = { 8, 9, 7, 6, 4, 1 };
        vector<int> v1(mynumbers, mynumbers + 6);
        for_each(v1.begin(), v1.end(), bind2nd(plus<int>(), 1));//LINE I
        for_each(v1.rbegin(), v1.rend(), printer);//LINE II
        return 0; }
4

3 に答える 3

2

の宣言operator()template <typename T> std::plus

T operator()(const T& lhs, const T& rhs) const;

つまり、入力引数は変更されません。必要なものstd::transform:

std::transform(v1.cbegin(), v1.cend() v1.begin(), std::bind2nd(std::plus<int>(), 1));

または、入力引数を変更するラムダを使用できます

std::for_each(v1.begin(), v1.end(), [] (int& x) { ++x; });
于 2016-03-29T13:47:55.183 に答える
1

std::for_each入力シーケンスを変更しません。

コンテナーの各要素に変更を適用するには、std::transform代わりに次を使用します。

transform(v1.begin(), v1.end(), v1.begin(), bind2nd(plus<int>(), 1));
//                              ~~~~~~~~~^ puts the results back into the input sequence
于 2016-03-29T13:46:25.697 に答える
1
for_each(v1.begin(), v1.end(), bind2nd(plus<int>(), 1));

は次のように等価です:

for (auto first = v1.begin(); first != last; ++first) {
    plus<int>()(*first, 1); // i.e. *first + 1;
}

ご覧のとおり、実際には何も変わりません。

次のように値を変更するファンクターを使用できますstd::for_each

std::for_each(v1.begin(), v1.end(), [](int &n){ n += 1; });
于 2016-03-29T13:49:04.817 に答える