C++ const map element access
Próbowałem użyć operatora [] dostępu do elementu w const C++ map, ale ta metoda nie powiodła się. Próbowałem też użyć "at ()", aby zrobić to samo. Tym razem zadziałało. Nie udało mi się jednak znaleźć żadnego odniesienia do używania "at ()", aby uzyskać dostęp do elementu w const C++ map. Czy "at ()" jest nowo dodaną funkcją w C++ map? Gdzie mogę znaleźć więcej informacji na ten temat? Dziękuję bardzo!
Przykład 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
}
Za użycie "B [3]", zwróciło następujące błędy podczas kompilacja:
T01.cpp: 14: error: passing ' const std:: Mapa, std:: allocator > > ' as 'this' argument ' _Tp& std:: map<_key>] ' discards qualifiers
Używany kompilator to g++ 4.2.1
4 answers
at()
jest nową metodą std::map
W C++11.
Zamiast wstawiać nowy domyślnie skonstruowany element, jak to robi operator[]
Jeśli element z podanym kluczem nie istnieje, rzuca wyjątek std::out_of_range
. (Jest to podobne do zachowania at()
dla deque
i vector
.)
Z powodu tego zachowania ma sens, aby const
było przeciążenie at()
, w przeciwieństwie do operator[]
, które zawsze ma potencjał do zmiany mapy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 14:38:12
Jeśli element nie istnieje w map
,operator []
doda-co oczywiście nie może działać na mapie const
, więc C++ nie definiuje wersji const
operatora. Jest to dobry przykład sprawdzania typu kompilatora zapobiegającego potencjalnemu błędowi uruchomieniowemu.
W Twoim przypadku, musisz użyć find
zamiast tego tylko zwróci (iterator) element, jeśli istnieje, nigdy nie zmieni 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" (=błąd Nowy W C++0x).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-27 17:34:22
Operator [] - utworzy nowy wpis na mapie, jeśli dany klucz nie istnieje. Może to zatem zmienić mapę.
Zobacz ten link .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-27 17:28:29
To dla mnie niespodzianka, ale Mapa STL nie ma const
operatora indeksu. Oznacza to, że B[3]
nie może być tylko do odczytu. Z podręcznika:
Ponieważ operator [] może wstawić nowy element do mapy, nie może to być funkcja const member.
Nie mam pojęcia o at()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-27 17:27:10