2011-02-27 18 views
61

Próbowałem użyć operatora [] dostępu do elementu w stałej mapie C++, ale ta metoda nie powiodła się. Próbowałem również użyć "at()", aby zrobić to samo. Tym razem zadziałało. Jednak nie mogłem znaleźć odniesienia do używania "at()", aby uzyskać dostęp do elementu w stałej mapie C++. Czy "at()" jest nową funkcją w mapie C++? Gdzie mogę znaleźć więcej informacji na ten temat? Dziękuję Ci bardzo!Dostęp do elementu mapy konstelacji C++

Przykładem może być następujący:

#include <iostream> 
#include <map> 

using namespace std; 

int main() 
{ 
     map<int, char> A; 
     A[1] = 'b'; 
     A[3] = 'c'; 

     const map<int, char> B = A; 

     cout << B.at(3) << endl; // it works 
     cout << B[3] << endl; // it does not work 

} 

stosowania "B" [3], to dało następujące błędy podczas kompilacji:

t01.cpp:14: error: passing ‘const std::map, std::allocator > >’ as ‘this’ argument of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = char, _Compare = std::less, _Alloc = std::allocator >]’ discards qualifiers

stosowany jest kompilator g ++ 4.2.1

Odpowiedz

80

at() to nowa metoda dla std::map w C++ 11.

Zamiast wstawiać nowy domyślny element zbudowany jako operator[], jeśli element z danym kluczem nie istnieje, generuje wyjątek std::out_of_range. (Jest to podobne do zachowania at() dla deque i vector.)

powodu tego zachowania ma sens tam być const przeciążenie at(), w przeciwieństwie operator[] który zawsze ma potencjał, by zmienić mapę.

+0

Czy można "zwrócić" wartość domyślną zamiast rzucać wyjątek? – user1202136

+0

'at()' powinno być tylko C++ 11 – Deqing

+0

Używam 'at()' with w VS2013 na zestaw projektu do używania zestawu narzędzi VS2010. Myślałem, że to oznacza, że ​​nie używam C++ 11 ... Ale mimo to kompiluje ... ?? – thomthom

27

Jeśli element nie istnieje w map, dodany zostanie operator [] - co oczywiście nie działa na mapie const, więc C++ nie definiuje operatora w wersji const. Jest to dobry przykład sprawdzania poprawności kompilatora, który zapobiega potencjalnemu błędowi wykonania.

W twoim przypadku trzeba użyć find zamiast które tylko zwraca iterator() do elementu, jeśli istnieje, to nigdy nie będziemy modyfikować map. Jeśli element nie istnieje, zwraca iterator do mapy end().

at nie istnieje i nie powinien nawet kompilować. Być może jest to "rozszerzenie kompilatora" (= bug new w C++ 0x).

+0

Czy standard C++ zabrania implementacji przed definiowaniem dodatkowych niestandardowych funkcji składowych w klasach bibliotek? –

+0

@ Tim Wierzę, że interfejs jest naprawiony, tak. –

3

Urządzenie [] -operator utworzy nowy wpis na mapie, jeśli podany klucz nie istnieje. Może więc zmienić mapę.

Zobacz tę link.

Powiązane problemy