提问人:Calder 提问时间:12/16/2012 更新时间:2/2/2013 访问量:6872
为什么 std::map 没有 const 访问器?
Why does std::map not have a const accessor?
问:
std::map 上 [] 运算符的声明如下:
T& operator[] ( const key_type& x );
不是这样有什么原因吗?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
因为每当您需要以 const 方法访问成员映射时,这都会非常有用。
答:
因为 的语义是添加密钥,如果它不存在。operator[]
operator[]
在映射中,返回指定键处的值,或者为该键创建一个新的值初始化元素(如果该元素尚不存在),因此这是不可能的。
如果有重载,则添加元素将不起作用。operator[]
const
这就回答了这个问题。选择:
对于 C++03 - 您可以使用迭代器(这些迭代器与 和 非耦合)。在 C++11 中,可以使用该方法。const
const
find
at
如果密钥不存在,则 (non-) 创建密钥。const
operator[]
该运算符的版本(如果存在)必须具有不同的语义,因为它无法添加新键。const
我相信你会同意,具有明显不同语义的重载和非重载将是一罐蠕虫。因此,未提供任何版本。const
const
const
不过,有一个 const 成员,因此您可以在代码中使用它。find()
从 C++11 开始,它提供了 const 和非 const 访问。std::map::at
相反,如果元素不在映射中,它将引发异常。operator[]
std::out_of_range
评论
这些答案是正确的,因为如果它不存在,则具有添加键的语义,但我想添加另一个视角:operator[]
请注意如何返回 .也就是说,它返回对与 关联的 的引用。但是,如果 中没有呢?我们应该返回什么?没有“空引用”这样的东西,抛出异常会很烦人。operator[]
T&
value
key
key
map
这将是不的一个很好的理由。如果您无法向用户添加任何内容(因为运算符是),但他们正在查找不存在的项目,您会返回给用户什么?解决这个问题的一个好办法是没有 .operator[] const
map
const
operator[] const
评论
T null_
null_
T
int
评论