为什么只有非常量映射提供类似关联数组的直接元素检索?

Joh*_*0te 6 c++ associative-array stl map

我正在阅读:

标准C++库:Nicolai M. Jossuttis的教程和参考

当我打算以任何重要方式使用某些STL机制时,这是我的首选.无论如何,我很快就重读了关于std :: map和相关算法的章节,我注意到了一个我以前没想过的句子:

非常量映射为直接元素访问提供下标运算符.但是,下标运算符的索引不是元素的整数位置....等

为什么只能在关联数组中使用非常量映射?在这种情况下,提供只读语义似乎相当简单.我想如果您尝试使用不存在的键检索元素,则可能存在异常(正如您的常量所示,无法向地图添加新键/值).

我想了解这背后的理由,如果有人能说清楚的话:)谢谢!

小智 11

为什么只能在关联数组中使用非常量映射?

因为这些运算符返回对与特定键关联的对象的引用.如果容器尚未包含此类对象,请operator[]插入默认对象.现在,如果容器是常量,则不能向其中插入任何对象,并且不能返回对不存在的对象的引用,这就是为什么这些运算符仅可用于非常量容器的原因.

当然,在这种情况下抛出异常是可能的,但是当不存在给定键的对象时,这不是处理非常一般情况的最佳方法.基本上,例外是非常昂贵的,并且是特殊情况,而上述情况则不然,因此不值得.

更好的方法是返回迭代器,但是用户必须检查它是否不是"结束",这将使用例类似于调用find (),所以没用.返回仅用于常量容器的迭代器或指针也是可能的,但这会破坏语义并且令人困惑.


dou*_*lep 8

在C++ 11中,您可以使用at()获取"获取映射值,否则抛出异常"行为.重载operator[]执行两个不同的事情(即插入新对或抛出)取决于映射是否是常量将太混乱和容易出错.