for_each循环中的bind2nd

时间:2016-03-29 13:40:40

标签: c++ foreach bind2nd

我目前无法解决一些问题。 我期待一个输出,其中每个元素增加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; }

3 个答案:

答案 0 :(得分:2)

template <typename T> std::plus operator()的声明是

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));

或者你可以使用修改它的输入参数的lambda:

std::for_each(v1.begin(), v1.end(), [] (int& x) { ++x; });

答案 1 :(得分: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

答案 2 :(得分: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; });