2010-10-05 17 views
6

Używam wyrażenie lambda C++ 0x do modyfikowania wartości mapy.Jak przekazać parametr wyrażenia Lambda przez odniesienie do C++ 0x

Jednak mając trudności z przekazywaniem iteratora mapy przez odniesienie.

Jeśli po prostu przekazać iterator, przez wartość taką jak: [](std::pair<TCHAR, int > iter) kompiluje dobrze, ale wartości nie są aktualizowane na mapie.

Gdy próbuję przekazać iterator przez odniesienie, jak [](std::pair<TCHAR, int >& iter) kompilator VS2010 narzeka, że ​​

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

Oto kod. Doceń informacje o tym, jak obiekty std :: map mogą być modyfikowane za pomocą wyrażeń lambda.

#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; 
} 

Dziękuję

Odpowiedz

4

Problem polega na tym, że nie wolno zmodyfikować klucz mapy.

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

Działa, ponieważ używa const TCHAR.

Edit:

Jak @David i inne plakaty podkreśliło, można byłoby lepiej wyłączyć za pomocą Map::value_type& co jest typedef dla std::pair<const TCHAR, int>& w tym przypadku, ponieważ jeśli później zmienić typy na mapie nie musisz zmieniać kodu pętli.

Dla porównania, tutaj jest pełny komunikat o błędzie, gdzie można zobaczyć, że stara się konwersji pomiędzy dwoma różnymi rodzajami pary, jedna z TCHAR, druga z 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 dla diagnozy problemu hte, ale lepszym rozwiązaniem byłoby użycie 'Map :: value_type &', ponieważ intencja jest bardziej przejrzysta i mniej podatna na błędy. –

+0

Dziękuję - sugestie działają. –

1

Jesteś nie przechodząc przez iterator, jesteś próbując przekazać odwołanie do map::value_type. Opublikowany kod nie powinien nawet się kompilować. Przekaż map::value_type&, a następnie program musi zwiększyć wartość int zapisaną na mapie.

Powiązane problemy