为什么std :: map :: operator []反直觉?

Ton*_*ark 4 c++ stl

对于通常用于访问数据结构的操作员来说,在我看来"邪恶"(在C++常见问题中的含义),突然被定义为将数据插入数据结构.

我想问题是'什么会更好'?对于某些类型的映射值,可以轻松回答这个问题; 例如,如果我们将键映射到指针,您可能真的希望operator []为不存在的键返回nullptr,但这显然不适用于其他类型.

它可以在不存在的键上抛出异常,甚至默认构造一个临时的并返回它而不将其添加到地图中.将[]从读取语义转换为此容器类型的写入语义的好理由是什么?

Sin*_*ion 12

基本问题是没有可靠区分的句法方法:

dosomething(collection[foo]);
Run Code Online (Sandbox Code Playgroud)

collection[foo] = something;
Run Code Online (Sandbox Code Playgroud)

在运营商的定义中.因为它可能出现在任一位置,所以该类确保它可以处理两者,如果需要,提供默认覆盖.如果你发现这是不合情理的,那么你需要std::map::operator[]完全避免.

另一个原因是当密钥不在列表中时必须有一些已定义的行为.由于operator[]必须返回一个值(LValue或RValue),因此它不能返回空指针,past-the-end迭代器或任何其他sentinel值.唯一剩下的选择是提出例外.STL不会引发很多异常,因为即使在没有异常的情况下也可以使用它.必须选择其他一些行为,这就是结果.

解决此问题的最佳方法是使用std::map不具有此行为的成员函数.那将是map::find(),map::end如果找不到密钥则返回.

  • 好吧,case*可以通过`operator []`来区分,返回一个代理,就像`std :: vector <bool> :: operator []`一样.它不是在句法层面,但我不明白为什么它需要.所以,这不是原因.我想,能够简单地分配新元素感觉更自然.它毕竟是一个关联数组,其主要工作是关联(键和值),因此应该很容易表达主要用法.干杯&hth., (3认同)