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

Author: icephere, 2011-02-27

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.

 90
Author: CB Bailey,
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).

 29
Author: Konrad Rudolph,
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 .

 3
Author: vidstige,
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().

 2
Author: Beta,
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