我很确定我已经在某个地方看到了这个问题(comp.lang.c++?谷歌似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以这里是:
如果键不存在,为什么 std::map operator[]
创建一个对象?我不知道,但对我来说,如果你与大多数其他 operator[](如 std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在 std::map
中实施这种行为的理由是什么。就像我说的那样,当使用无效键访问时,更像是向量中的索引和崩溃(我猜是未定义的行为)不是更直观吗?
我得到了很多答案,基本上都说“它很便宜,为什么不呢?”或类似的。我完全同意这一点,但为什么不为此使用专用函数(我认为其中一条评论说在 Java 中没有 operator[]
并且该函数被称为 put
)?我的观点是为什么 map operator[]
不像矢量一样工作?如果我在向量的超出范围索引上使用 operator[]
我不希望它插入一个元素 ,即使它很便宜,因为这可能意味着我的代码中有错误。我的观点是为什么它与地图不一样。我的意思是,对我来说,在地图上使用 operator[]
意味着:我知道这个密钥已经存在(无论出于何种原因,我刚刚插入它,我在某处有冗余,无论如何)。我认为这样会更直观。
这就是说使用 operator[] 执行当前行为的优势是什么(仅此而已,我同意应该存在具有当前行为的函数,而不是 operator[])
?也许它提供了更清晰的代码方式?我不知道。
另一个答案是它已经以这种方式存在,所以为什么不保留它,但是,可能当他们(stl 之前的那些)选择以这种方式实现它时,他们发现它提供了优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他 operator[]
缺乏一致性。它有什么好处?
原文由 n1ckp 发布,翻译遵循 CC BY-SA 4.0 许可协议
因为
operator[]
返回对值本身的引用,因此指示问题的唯一方法是抛出异常(通常,STL 很少抛出异常)。如果您不喜欢这种行为,您可以使用
map::find
代替。它返回一个迭代器而不是值。这允许它在未找到该值时返回一个特殊的迭代器(它返回map::end
),但还需要您取消引用迭代器以获取该值。