C++匿名函数(Lambda)引用传递无法修改MAP值问题

牛奶味的榴莲 2018-07-06 05:59:42
#include "stdafx.h"
#include <map>
#include <algorithm>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{

int iValue[] = { 1, 2, 3, 4, 5 };
std::map<int, bool >cfgAcceptList;

std::for_each(std::begin(iValue), std::end(iValue), [&](int index){ cfgAcceptList[index] = false; });

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
std::cout << "赋值前Key:" << list.first << "Value:" << list.second << std::endl;
});

std::cout << std::endl;


std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
list.second = true;
});


std::cout << std::endl;

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
std::cout<< "赋值后Key:" << list.first << "Value:" << list.second << std::endl;
});

system("push");
return 0;
}

以上代码理论上在第二个for_each的时候会改变map的值,但是小弟这里测试发现值没有被改变。
请问是因为我这个匿名函数的值引用方式有问题么?该如何处理,请大家指正?
...全文
599 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
牛奶味的榴莲 2018-07-13
  • 打赏
  • 举报
回复
引用 2 楼 sghcpt 的回复:
楼主,改成下面就可以~~
int _tmain(int argc, _TCHAR* argv[])
{

int iValue[] = { 1, 2, 3, 4, 5 };
std::map<int, bool >cfgAcceptList;

std::for_each(std::begin(iValue), std::end(iValue), [&](int index){ cfgAcceptList[index] = false; });

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
std::cout << "赋值前Key:" << list.first << "Value:" << list.second << std::endl;
});

std::cout << std::endl;


std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
cfgAcceptList[list.first] = true;
});


std::cout << std::endl;

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
std::cout << "赋值后Key:" << list.first << "Value:" << list.second << std::endl;
});

system("push");
return 0;
}



感谢解答。
这样是可以解决问题,但是我是想通过匿名函数在在引用传递的时候就把值处理了。
牛奶味的榴莲 2018-07-13
  • 打赏
  • 举报
回复
引用 3 楼 baiywcwttfln 的回复:
去看一下,转值和转引用的区别

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::map<int, bool >::value_type &list) {
list.second = true;
});


谢谢。

在匿名函数中引用传递不是这样写的
牛奶味的榴莲 2018-07-13
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
你用错了,最后一个参数是一个函数,或者函数对象
具体请百度


谢谢!
可能你对于匿名函数还不是很了解,我为了方便描述问题从成员函数中剥离出来写一个简单的demo。
如果是成员函数得用bind进行绑定操作,这个比较麻烦。因为不想用boost那一堆复杂的处理,所以直接使用匿名函数。
A-De 2018-07-13
  • 打赏
  • 举报
回复
引用 7 楼 zhengleiaixirui 的回复:
[quote=引用 3 楼 baiywcwttfln 的回复:]
去看一下,转值和转引用的区别

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::map<int, bool >::value_type &list) {
list.second = true;
});


谢谢。

在匿名函数中引用传递不是这样写的[/quote]

你的意思是匿名函数的 [&] 这个吗?
这里直接用函数参数引用就 可以了
匿名函数引用到cfgAcceptList这个变量,
不是很明白你的问题
内核之道 2018-07-10
  • 打赏
  • 举报
回复
楼主可参考:https://blog.csdn.net/lixiaogang_theanswer/article/details/80905445
A-De 2018-07-09
  • 打赏
  • 举报
回复
去看一下,转值和转引用的区别

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::map<int, bool >::value_type &list) {
list.second = true;
});
sghcpt 2018-07-09
  • 打赏
  • 举报
回复
楼主,改成下面就可以~~
int _tmain(int argc, _TCHAR* argv[])
{

int iValue[] = { 1, 2, 3, 4, 5 };
std::map<int, bool >cfgAcceptList;

std::for_each(std::begin(iValue), std::end(iValue), [&](int index){ cfgAcceptList[index] = false; });

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
std::cout << "赋值前Key:" << list.first << "Value:" << list.second << std::endl;
});

std::cout << std::endl;


std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
cfgAcceptList[list.first] = true;
});


std::cout << std::endl;

std::for_each(std::begin(cfgAcceptList), std::end(cfgAcceptList),
[&](std::pair<int, bool> list){
std::cout << "赋值后Key:" << list.first << "Value:" << list.second << std::endl;
});

system("push");
return 0;
}
真相重于对错 2018-07-08
  • 打赏
  • 举报
回复
你用错了,最后一个参数是一个函数,或者函数对象
具体请百度

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧