Rumah >pembangunan bahagian belakang >C++ >Akses Peta Const: Mengapa Gunakan `at()` Daripada `operator[]`?

Akses Peta Const: Mengapa Gunakan `at()` Daripada `operator[]`?

DDD
DDDasal
2024-12-04 09:30:12123semak imbas

Const Map Access: Why Use `at()` Instead of `operator[]`?

Mengakses Elemen dalam Peta Konst: Operator[] vs. at()

Apabila bekerja dengan peta malar, mengakses elemen menggunakan operator[ ] mungkin gagal. Walau bagaimanapun, menggunakan at() adalah alternatif yang berdaya maju. Mengapakah ini berlaku?

Dalam peta bukan const, operator[] melaksanakan dua fungsi:

  • Jika kunci wujud, ia mengembalikan rujukan kepada nilai yang berkaitan.
  • Jika kunci tidak wujud, ia membina nilai binaan lalai yang dikaitkan dengan kunci dan mengembalikan rujukan kepada ia.

Walau bagaimanapun, dalam peta const, operator[] tidak dibenarkan mengubah suai struktur data asas. Oleh itu, ia hanya boleh melaksanakan fungsi pertama dan melemparkan ralat apabila cuba memasukkan elemen baharu menggunakan fungsi kedua.

Sebaliknya, at() ialah kaedah yang diperkenalkan dalam C 11 khusus untuk mengakses elemen dalam a peta const. Ia memberikan beberapa faedah:

  • Ia memberikan pengecualian std::out_of_range jika kunci tidak wujud, menjadikannya konsisten dengan bekas lain seperti vektor dan deque.
  • Ia mempunyai const overload, membenarkan penggunaannya pada peta const.

Atas sebab ini, at() ialah kaedah yang disyorkan untuk mengakses elemen dalam const std::map. Kod contoh:

#include <iostream>
#include <map>

int main()
{
    std::map<int, char> A;
    A[1] = 'b';
    A[3] = 'c';

    const std::map<int, char>& B = A;

    std::cout << B.at(3) << std::endl; // it works
    std::cout << B[3] << std::endl;    // it does not work
}

Akan mengeluarkan:

c
error: can't access elements with operator[] in a const std::map

Atas ialah kandungan terperinci Akses Peta Const: Mengapa Gunakan `at()` Daripada `operator[]`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn