bind2nd 在 for_each 循环中
bind2nd in a for_each loop
有些事情我目前无法理解。
我期待每个元素递增 1 的输出。
显然不是这样。
仔细一看,我认为这是因为 bind2nd 函数的 return 值被丢弃了;也就是说该函数不修改容器的元素。
我的想法对吗?有人可以确认或提供容器未被修改的正确解释吗?
#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; }
std::for_each
不修改输入序列。
要对容器的每个元素应用更改,请改用 std::transform
:
transform(v1.begin(), v1.end(), v1.begin(), bind2nd(plus<int>(), 1));
// ~~~~~~~~~^ puts the results back into the input sequence
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; });
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; });
有些事情我目前无法理解。 我期待每个元素递增 1 的输出。 显然不是这样。
仔细一看,我认为这是因为 bind2nd 函数的 return 值被丢弃了;也就是说该函数不修改容器的元素。
我的想法对吗?有人可以确认或提供容器未被修改的正确解释吗?
#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; }
std::for_each
不修改输入序列。
要对容器的每个元素应用更改,请改用 std::transform
:
transform(v1.begin(), v1.end(), v1.begin(), bind2nd(plus<int>(), 1));
// ~~~~~~~~~^ puts the results back into the input sequence
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; });
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; });