是否有任何理由讓std :: vector的operator []返回一個引用而不是插入一個新元素?
std::vector::operator[]
在陣列狀的方式實現,因爲std::vector
是一個序列容器(即,陣列狀)。整數類型的標準數組不能被訪問出界。類似地,訪問std::vector::operator[]
的矢量長度以外的索引也是不允許的。所以,是的,它沒有被實現的原因是因爲在其他情況下,C++中的數組就像這樣。
std::map::operator[]
不是序列容器。其語法與其他語言中的關聯數組類似。在C++(及其前身C)方面,map::operator[]
只是語法糖。它是operator[]
家族的「黑羊」,而不是std::vector::operator[]
。
C++規範中有趣的部分是,使用std::map::operator[]
,添加一個元素到地圖上,使用不存在的鍵訪問地圖。因此,
#include <iostream>
#include <map>
int main(void) {
std::map<char, int> m;
m['a'] = 1;
std::cout << "m['a'] == " << m['a'] << ", m.size() == " << m.size() << std::endl;
std::cout << "m['b'] == " << m['b'] << ", m.size() == " << m.size() << std::endl;
}
結果:
m['a'] == 1, m.size() == 1
m['b'] == 0, m.size() == 2
參見:Difference between map[] and map.at in C++?:
[map::at
]如果如果元素的鍵不存在,find
返回aMap.end()
拋出異常不存在,並且operator[]
值初始化如果沒有v,相應密鑰的新值在那裏存在。
'std :: map :: operator []'的方式實際上已經導致了足夠的混亂。 UB適合'std :: vector'訪問越界。 –
想象一下,如果我們寫'some_vector [1000]'而'some_vector'的大小是10時會發生什麼。那麼,我不知道中間的990條目想象什麼。 –
@NickyC:但是地圖有同樣的問題! –