n1c*_*ckp 34 c++ stdmap design-rationale
我很确定我已经在某个地方看到了这个问题(comp.lang.c ++?Google似乎也没有在那里找到它)但是这里的快速搜索似乎没有找到它所以这里是:
如果密钥不存在,为什么std :: map operator []会创建一个对象?我不知道,但对我而言,如果你与大多数其他运算符[](如std :: vector)进行比较,这似乎是违反直觉的,如果你使用它,你必须确保索引存在.我想知道在std :: map中实现这种行为的理由是什么.就像我说的那样,当使用无效密钥访问时,更像行动中的索引和崩溃(我猜是未定义的行为)会不会更直观?
看到答案后提炼我的问题:
好到目前为止,我得到了很多答案,说基本上它便宜,所以为什么不是或类似的东西.我完全同意这一点,但为什么不使用专用函数(我认为其中一条评论说在java中没有operator []并且函数被称为put)?我的观点是为什么不映射operator []像vector一样工作?如果我在向量上的超出范围索引上使用operator []我不希望它插入一个元素,即使它很便宜,因为这可能意味着我的代码中的错误.我的观点是为什么地图不一样.我的意思是,对我来说,在地图上使用operator []意味着:我知道这个密钥已经存在(无论出于什么原因,我只是插入它,我在某处有冗余,无论如何).我认为这样会更直观.
那说使用operator []执行当前行为的优点是什么(仅限于此,我同意具有当前行为的函数应该在那里,而不是operator [])?也许它以这种方式提供更清晰的代码?我不知道.
另一个答案是,它已经存在,所以为什么不保留它然后,可能当他们(stl之前的那些)选择实现它,他们发现它提供了一个优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他运算符[]有点缺乏一致性.它给了什么好处?
谢谢
R S*_*hko 22
因为operator[]返回对值本身的引用,因此指示问题的唯一方法是抛出异常(通常,STL很少抛出异常).
如果您不喜欢此行为,则可以map::find改为使用.它返回一个迭代器而不是值.这允许它在找不到值时返回一个特殊的迭代器(它返回map::end),但是还要求你取消引用迭代器来获取值.
Kir*_*sky 13
标准说(23.3.1.2/1)运算符[]返回(*((insert(make_pair(x, T()))).first)).second.这就是原因.它返回参考T&.无法返回无效引用.它返回参考因为我觉得很方便,不是吗?
回答你真正的问题:没有令人信服的解释为什么这样做."只是因为".
由于std::map是一个关联容器,因此地图中必须存在(或不存在)的键没有明确的预定义范围(与完全不同的情况相反std::vector).这意味着std::map,您需要非插入和插入查找功能.可以[]以非插入方式过载并提供插入功能.或者可以采用相反的方式:[]作为插入运算符重载并为非插入搜索提供函数.所以,某人有时决定采用后一种方法.这就是它的全部内容.
如果他们反过来这样做,也许今天有人会在这里问你的问题的反向版本.
| 归档时间: |
|
| 查看次数: |
14195 次 |
| 最近记录: |