2010-10-05 2 views
6

Я использую выражение лямбда C++ 0x для изменения значений карты.Как передать параметр выражения Lambda по ссылке для C++ 0x

Однако, с трудностью передать итератор карты по ссылке.

Если я просто передаю итератор, по значению, например: [](std::pair<TCHAR, int > iter), он компилируется отлично, но значения не обновляются на карте.

Если я пытаюсь передать итератор по ссылке, например, [](std::pair<TCHAR, int >& iter) VS2010 компилятор жалуется, что

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

Вот код. Оцените информацию о том, как объекты 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; 
} 

Спасибо

ответ

4

Проблема заключается в том, что вы не можете изменить ключ карты.

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

Будет работать, потому что он использует const TCHAR.

Edit:

Как @David и другие плакаты отметили, вы бы лучше использовать Map::value_type&, который является ЬурейиМ для std::pair<const TCHAR, int>& в этом случае, потому что если вы позже изменить типы на карте вы вам также не понадобится менять код цикла.

Для справки, здесь полное сообщение об ошибке, в котором вы можете увидеть, что пытается конвертировать между двумя различными типами пары, одна с 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 
    ] 
+3

+1 для диагностики проблемы hte, но лучшим решением будет использование «Map :: value_type &», поскольку цель более ясна и менее подвержена ошибкам. –

+0

Спасибо - предложения работают. –

1

Вы не передавая итератор, вы пытается передать ссылку на map::value_type. Код как опубликованный не должен компилироваться. Pass map::value_type&, то программа должна увеличить значение int, сохраненное на карте.

 Смежные вопросы

  • Нет связанных вопросов^_^