如何通过引用为C ++ 0x传递Lambda表达式参数

时间:2010-10-05 07:47:42

标签: c++ lambda c++11 std

我正在使用C ++ 0x lambda表达式来修改地图的值。

但是,通过引用传递map迭代器有困难。

如果我只是通过迭代器传递,例如:[](std::pair<TCHAR, int > iter),它编译得很好,但值不会在地图中更新。

如果我尝试通过引用传递迭代器,例如[](std::pair<TCHAR, int >& iter) VS2010编译器抱怨它

cannot convert paramater from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &'

这是代码。欣赏有关如何使用lambda表达式修改std :: map对象的信息。

#include <tchar.h>
#include <map>
#include <algorithm>
#include <vector>
int _tmain(int argc, _TCHAR* argv[])
{
    typedef std::map<TCHAR, int > Map;

    Map charToInt;

    charToInt[_T('a')] = 'a';
    charToInt[_T('b')] = 'b';
    charToInt[_T('c')] = 'c';
    charToInt[_T('d')] = 'd';

    std::for_each(charToInt.begin(), charToInt.end(), [](std::pair<TCHAR, int >& iter)
    {
        int& val = iter.second;
        val++;
    });

    return 0;
}

谢谢

2 个答案:

答案 0 :(得分:4)

问题是您不能修改地图的密钥。

std::for_each(charToInt.begin(), charToInt.end(), [](std::pair<const TCHAR, int>& iter)

可行,因为它使用const TCHAR

编辑:

正如@David和其他海报所指出的那样,在这种情况下你最好使用Map::value_type&这是std::pair<const TCHAR, int>&的typedef,因为如果你以后更改了地图中的类型你正在使用你也不需要改变循环代码。

供参考,以下是完整的错误消息,您可以看到它正在尝试在两种不同类型的对之间进行转换,一种使用TCHAR,另一种使用const TCHAR ...

cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &'
    with
    [
        _Ty1=TCHAR,
        _Ty2=int
    ]
    and
    [
        _Ty1=const TCHAR,
        _Ty2=int
    ]
    and
    [
        _Ty1=TCHAR,
        _Ty2=int
    ]

答案 1 :(得分:1)

你没有传递迭代器,你尝试传递对map::value_type的引用。发布的代码甚至不应该编译。通过map::value_type&,程序必须增加地图中存储的int值。