Akses elemen peta C ++

100

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

tempat es
sumber

Jawaban:

124

at()adalah metode baru untuk std::mapdi C ++ 11.

Daripada menyisipkan elemen bawaan baru seperti yang operator[]dilakukan jika elemen dengan kunci yang diberikan tidak ada, ini akan melontarkan std::out_of_rangepengecualian. (Ini mirip dengan perilaku at()untuk dequedan vector.)

Karena perilaku ini masuk akal jika terjadi constkelebihan muatan at(), tidak seperti operator[]yang selalu berpotensi mengubah peta.

CB Bailey
sumber
Apakah mungkin untuk memiliki "at" mengembalikan nilai default daripada memberikan pengecualian?
pengguna1202136
Saya menggunakan at()dengan di VS2013 pada set proyek untuk menggunakan toolkit VS2010. Saya pikir itu berarti saya tidak menggunakan C ++ 11 ... Tapi belum dikompilasi ... ??
thomthom
1
Saya hanya perlu berkomentar bahwa tidak masuk akal untuk menghilangkan operator const [], yang juga dapat membuat pengecualian untuk elemen yang tidak dipetakan daripada mengubah peta.
Spencer
@ Spencer Akan mengejutkan jika kelebihan beban const dan non-const dari operator [] memiliki efek yang berbeda. Biasanya, kita mengharapkan bahwa jika beberapa objek atau referensi non-const dalam sebuah program dijadikan const, program akan terus berperilaku dengan cara yang sama, selama ia dikompilasi. Hanya mengizinkan overload non-const untuk menampilkan pengecualian dapat menyebabkan bug yang tidak tertangkap hingga waktu proses.
Brian
@ Brian Apakah Anda bermaksud mengatakan "Hanya mengizinkan beban const untuk membuang pengecualian"?
Spencer
33

Jika elemen tidak ada di a map, operator []akan menambahkannya - yang jelas tidak bisa bekerja di constpeta sehingga C ++ tidak mendefinisikan constversi operator. Ini adalah contoh bagus dari pemeriksa tipe kompiler yang mencegah potensi kesalahan runtime.

Dalam kasus Anda, Anda perlu menggunakan findsebagai gantinya yang hanya akan mengembalikan elemen (iterator ke) jika ada, itu tidak akan pernah memodifikasi map. Jika item tidak ada, ia mengembalikan iterator ke peta end().

attidak ada dan seharusnya tidak dikompilasi. Mungkin ini adalah "ekstensi kompilator" (=sebuah bug baru di C ++ 0x).

Konrad Rudolph
sumber
Apakah standar C ++ melarang implementasi untuk menentukan fungsi anggota non-standar tambahan di kelas perpustakaan?
Tim Martin
@ Tim Saya yakin antarmuka sudah diperbaiki, ya.
Konrad Rudolph
4

Operator [] akan membuat entri baru di peta jika kunci yang diberikan tidak ada. Dengan demikian, ini dapat mengubah peta.

Lihat tautan ini .

vidstige.dll
sumber