首頁 >後端開發 >C++ >常數映射存取:為什麼使用 `at()` 而不是 `operator[]`?

常數映射存取:為什麼使用 `at()` 而不是 `operator[]`?

DDD
DDD原創
2024-12-04 09:30:12123瀏覽

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

存取常數映射中的元素:運算子[]與at()

使用常數映射時,使用運算子[存取元素] 可能會失敗。然而,使用 at() 是一個可行的替代方案。為什麼會出現這種情況?

在非常量映射中,operator[] 執行兩個功能:

  • 如果鍵存在,則傳回關聯值的參考。
  • 如果鍵不存在,它會建構一個與此鍵關聯的預設構造值並傳回對

但是,在const 映射中,operator[] 不允許修改底層數據結構。因此,它只能執行第一個函數,並在嘗試使用第二個函數插入新元素時拋出錯誤。

相反,at() 是 C 11 中引入的一種方法,專門用於存取 a 中的元素。常量映射。它提供了幾個好處:

  • 如果鍵不存在,它會拋出 std::out_of_range 異常,使其與向量和雙端隊列等其他容器一致。
  • 它有一個const 重載,允許在 const 映射上使用它。

基於這些原因,at() 是存取元素的建議方法一個 const std::map。範例程式碼:

#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
}

將輸出:

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

以上是常數映射存取:為什麼使用 `at()` 而不是 `operator[]`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn