std::map::insert
我对's 的语义有点困惑。我的意思是,我没有抱怨 - 标准就是标准,API 就是它的样子。仍然,
insert
将要
插入操作检查每个插入的元素是否在容器中已经存在具有相同键值的另一个元素,如果存在,则不插入该元素并且其映射值不会以任何方式更改。
而且 - 只有在其单参数版本中,pair<iterator,bool> insert ( const value_type& x );
它才会告诉您它是否甚至将(新的,可能不同的)值插入到键中。据我了解,如果密钥已经存在,迭代器版本将默默地忽略插入。
对我来说,这简直是违反直觉的,我本来希望值部分被覆盖,旧值部分在插入时被丢弃。显然,STL 的设计者有不同的想法——任何人都知道(历史)基本原理,或者可以对现有语义如何(更多)有意义给出彻底的解释?
举例:
有几种基本方法可以在单键映射中实现插入,例如std::map
:
- 插入,如果已经存在则替换
- 插入,如果已经存在则忽略(这是 std::map 的行为)
- 插入,如果已经存在则抛出错误
- 插入,UB 如果已经存在
我现在试图理解为什么比(或)insert_or_ignore
更有意义!insert_or_replace
insert_or_error
我查看了我的TC++PL副本(不幸的是,我只有德语版),有趣的是,Stroustrup 在第 17.4.1.7 章(map的列表操作)中写道:(抱歉,德语粗略翻译)
(...) 通常,人们不在乎键(原文如此!)是新插入的还是在调用
insert()
(...)之前已经存在
在我看来,这仅适用于set,而不适用于map,因为对于地图,如果插入提供的值或旧的值保留在地图中,它确实会产生很大的不同。(这显然与密钥无关,因为它是等效的。)
注意:我知道operator[]
并且我知道有效 STL的第 24 项以及那里提出的efficientAddOrUpdate
功能。我只是对insert
's 语义的基本原理感到好奇,因为我个人发现它们违反直觉。