是否有任何理由让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:但是地图有同样的问题! –