簡體   English   中英

為什么C ++ STL向量不會超出范圍

[英]Why C++ STL vector does not go out of range

我有這段代碼,我想知道它是如何工作的。 為什么它允許我使用operator[]使用大於向量大小的值訪問元素?

但是,當我使用執行邊界檢查的at()函數時,它將引發適當的錯誤。

我讀到這樣做的行為是undefined ,但是我很好奇:為什么operator[]用於超出范圍的元素訪問?

// vector of length 3
std::vector<int> adj(3);

// output: 3
printf("Size of adj is %lu\n", adj.size());

// assign using index that is larger than vector size, e.g., 12
adj[12] = 314159;

// succeeds, output: 314159
printf("adj[12] is %d", adj[12]);

// fails, throws out_of_range
adj.at(12);

出於速度原因,不會檢查越界。 假定程序員在使用operator []之前就知道自己已處於極限。

同樣,未定義的行為也可能導致任何事情從預期的行為發生變化,甚至崩潰,甚至導致您的鼻腔開口進入地獄。

實際上,這是設計使然:訂閱運算符( operator[] )不會檢查您是否嘗試越界。

原因是性能。 使用operator[]與訪問數組中的元素一樣快。 C ++是圍繞性能而設計的,因此對於高性能域中的大多數C ++項目而言,這是至關重要的功能。

為可以在運行時驗證中犧牲性能的項目提供了at函數。 如果沒有遍歷向量的關鍵更新循環,該循環必須很快,並且如果用戶確實要求訪問數據時希望讓代碼拋出,那么使用at()會很有幫助。

默認情況下,大多數C ++用戶都會使用operator[]來提高效率,並確保不會產生無效索引(通過檢查不是必須的,而只是通過使算法不可能越界就可以了,就像僅使用有效的迭代器和size()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM