Saya mencoba menggunakan operator [] mengakses elemen dalam peta const C ++, tetapi metode ini gagal. Saya juga mencoba menggunakan "at ()" untuk melakukan hal yang sama. Kali ini berhasil. Namun, saya tidak dapat menemukan referensi tentang penggunaan "at ()" untuk mengakses elemen di peta C ++ const. Apakah "at ()" adalah fungsi yang baru ditambahkan di peta C ++? Di mana saya dapat menemukan info lebih lanjut tentang ini? Terima kasih banyak!
Contohnya adalah sebagai berikut:
#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
}
Untuk menggunakan "B [3]", ini mengembalikan kesalahan berikut selama kompilasi:
t01.cpp: 14: error: passing 'const std :: map, std :: alocator>>' sebagai argumen 'this' dari '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [dengan _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: alokator>] 'membuang qualifier
Kompiler yang digunakan adalah g ++ 4.2.1
at()
dengan di VS2013 pada set proyek untuk menggunakan toolkit VS2010. Saya pikir itu berarti saya tidak menggunakan C ++ 11 ... Tapi belum dikompilasi ... ??Jika elemen tidak ada di a
map
,operator []
akan menambahkannya - yang jelas tidak bisa bekerja diconst
peta sehingga C ++ tidak mendefinisikanconst
versi operator. Ini adalah contoh bagus dari pemeriksa tipe kompiler yang mencegah potensi kesalahan runtime.Dalam kasus Anda, Anda perlu menggunakan
find
sebagai gantinya yang hanya akan mengembalikan elemen (iterator ke) jika ada, itu tidak akan pernah memodifikasimap
. Jika item tidak ada, ia mengembalikan iterator ke petaend()
.at
tidak ada dan seharusnya tidak dikompilasi. Mungkin ini adalah "ekstensi kompilator" (=sebuah bugbaru di C ++ 0x).sumber
Operator [] akan membuat entri baru di peta jika kunci yang diberikan tidak ada. Dengan demikian, ini dapat mengubah peta.
Lihat tautan ini .
sumber
Ini cukup mengejutkan bagi saya, tetapi peta STL tidak memiliki
const
operator indeks. Artinya,B[3]
tidak bisa hanya-baca. Dari manual:Karena operator [] mungkin memasukkan elemen baru ke dalam peta, itu tidak mungkin menjadi fungsi anggota const.
Saya tidak tahu tentang
at()
.sumber