我很确定我已经在某处看到过这个问题(comp.lang.c++?谷歌似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以这里是:
为什么std::map operator[]
如果键不存在,则创建一个对象?我不知道,但对我来说,如果与大多数其他运算符[](如 std::vector)进行比较,这似乎是违反直觉的,如果使用它,则必须确保索引存在。我想知道实施这种行为的理由是什么std::map
。就像我说的那样,当使用无效密钥访问时,更像向量中的索引和崩溃(我猜是未定义的行为)会更直观吗?
我收到的很多答案基本上都是“很便宜,为什么不呢?”或类似的。我完全同意这一点,但为什么不为此使用专用函数(我认为其中一条评论说在 Java 中没有operator[]
该函数被称为put
)?我的观点是为什么不map operator[]
像向量一样工作?如果我使用operator[]
在向量上超出范围的索引上我不希望它插入元素即使它很便宜因为这可能意味着我的代码中有错误。我的观点是为什么它与地图不一样。我的意思是,对我来说,使用operator[]
在地图上意味着:我知道这个键已经存在(无论出于何种原因,我只是插入它,我在某处有冗余,无论如何)。我认为这样会更直观。
这就是说,使用运算符 [] 执行当前行为的优点是什么(仅此而已,我同意应该存在具有当前行为的函数,而不是operator[])
?也许这样可以提供更清晰的代码?我不知道。
另一个答案是它已经存在了,所以为什么不保留它,但是,也许当他们(stl之前的人)选择以这种方式实现它时,他们发现它提供了优势或其他什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他方法有点缺乏一致性operator[]
。它有什么好处?
Because operator[]
返回对值本身的引用,因此指示问题的唯一方法是引发异常(一般来说,STL 很少引发异常)。
如果您不喜欢这种行为,您可以使用map::find
反而。它返回一个迭代器而不是值。这允许它在找不到值时返回一个特殊的迭代器(它返回map::end
)但还需要您取消引用迭代器才能获取该值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)