【发布时间】:2010-12-11 00:08:02
【问题描述】:
我很确定我已经在某个地方看到了这个问题(comp.lang.c++?Google 似乎也没有在那里找到它)但是在这里快速搜索似乎没有找到它所以这里是:
如果键不存在,为什么 std::map operator[] 会创建一个对象?我不知道,但对我来说,如果你与大多数其他 operator[](如 std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在 std::map 中实现这种行为的理由是什么。就像我说的那样,当使用无效键访问时,更像是向量中的索引并崩溃(我猜是未定义的行为)不是更直观吗?
看到答案后细化我的问题:
好的,到目前为止,我得到了很多答案,基本上它很便宜,所以为什么不或类似的东西。我完全同意这一点,但为什么不为此使用专用函数(我认为其中一条评论说在 java 中没有 operator[] 并且该函数称为 put)?我的观点是为什么 map operator[] 不像矢量那样工作?如果我在向量的超出范围索引上使用 operator[],我不希望它插入一个元素 即使它很便宜,因为这可能意味着我的代码中有错误。我的观点是为什么它与地图不一样。我的意思是,对我来说,在地图上使用 operator[] 意味着:我知道这个密钥已经存在(无论出于何种原因,我只是插入了它,我在某处有冗余,无论如何)。我认为这样会更直观。
也就是说,使用 operator[] 执行当前行为有什么好处(仅为此,我同意应该存在具有当前行为的函数,而不是 operator[])?也许这样可以提供更清晰的代码?我不知道。
另一个答案是它已经以这种方式存在,所以为什么不保留它,但可能当他们(stl 之前的那些)选择以这种方式实现它时,他们发现它提供了优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他 operator[] 有点缺乏一致性。它有什么好处?
谢谢
【问题讨论】:
-
对于 std::vector 的 operator[] 未选中。如果您尝试访问向量范围之外的内容,它会愉快地返回对无效对象的引用。如果您需要检查,请使用 at() 方法。另一方面 std::map 不能这样做。 map 的简单解决方法就是使用 find() 方法。
-
std::vector operator[] 不能保证不被选中,只是不需要被选中。
-
@David Thornley:谢谢,我不知道。
-
我只是希望他们有一个
const版本的订阅运算符,我准备付出例外的代价来避免使用map::find+map::end,真的。 -
@MatthieuM。同意。不过,您可以改用
map::count。
标签: c++ stdmap design-rationale