Tentei usar o operador [] para acessar o elemento em um mapa const C ++, mas esse método falhou. Também tentei usar "at ()" para fazer a mesma coisa. Funcionou dessa vez. No entanto, não consegui encontrar nenhuma referência sobre o uso de "at ()" para acessar o elemento em um mapa const C ++. É "at ()" uma função recém-adicionada no mapa C ++? Onde posso encontrar mais informações sobre isso? Muito obrigado!
Um exemplo poderia ser o seguinte:
#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
}
Para usar "B [3]", ele retornou os seguintes erros durante a compilação:
t01.cpp: 14: erro: passando 'const std :: map, std :: allocator>>' como 'este' argumento de '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [with _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'descarta qualificadores
O compilador usado é g ++ 4.2.1
at()
no VS2013 em um projeto definido para usar o kit de ferramentas VS2010. Achei que isso significava que não estava usando C ++ 11 ... Mas ainda assim ele compila ... ??Se um elemento não existir em a
map
, ooperator []
adicionará - o que obviamente não pode funcionar em umconst
mapa, portanto C ++ não define umaconst
versão do operador. Este é um bom exemplo do verificador de tipo do compilador evitando um possível erro de tempo de execução.No seu caso, você precisa usar o
find
que só retornará um (iterador para o) elemento se ele existir, ele nunca modificará omap
. Se um item não existir, ele retorna um iterador para o do mapaend()
.at
não existe e nem deveria compilar. Talvez esta seja uma “extensão do compilador” (=um insetonovo em C ++ 0x).fonte
O operador [] criará uma nova entrada no mapa se a chave fornecida não existir. Isso pode, portanto, mudar o mapa.
Veja este link .
fonte
Isso é uma grande surpresa para mim, mas o mapa STL não tem um
const
operador de índice. Ou seja,B[3]
não pode ser somente leitura. Do manual:Visto que operator [] pode inserir um novo elemento no mapa, não pode ser uma função-membro const.
Eu não tenho ideia sobre
at()
.fonte