问题描述
std :: inserter遇到的问题是,如果键已经存在,它会调用插入操作来使map为noop。 有std::map::insert_or_assign,但我找不到使用该插件的插入器。
C ++ 20中是否有类似的东西?
注意:我知道我可以从SO / Internet上的某个地方进行c / p,我对STL / boost解决方案感兴趣,而不是从某个地方的c / p实现。
解决方法
否,没有相应的使用insert_or_assign
的插入器。实际上,wording明确表示只有3个这样的功能:
,back_inserter,front_inserter和inserter这三个函数使插入迭代器脱离容器。
C ++ 20标准库中没有具有insert_or_assign
功能的插入迭代器
插入迭代器受[insert.iterators]控制,[insert.iterators]/1中特别描述了唯一创建迭代器的功能
[...]
back_inserter
,front_inserter
和inserter
是使插入迭代器脱离容器的三个函数。 [...]
分别为back_inserter
,front_inserter
和inserter
,分别由[back.inserter],[front.inserter]和[inserter]覆盖,它们返回{分别为{1}},back_insert_iterator
和front_insert_iterator
。
根据[back.insert.iter.ops],[front.insert.iter.ops]和[insert.iter.ops]的规定,将insert_iterator
的副本分配给这些迭代器的效果就像调用
value
分别。即,这些插入迭代器均不提供// back_insert_iterator
container->push_back(value);
// front _insert_iterator
container->push_front(value);
// insert_iterator
container->insert(iter,value);
和insert_or_assign
的{{1}}成员函数的作用(N4713引入了该成员函数,这丝毫没有提及插入迭代器在[insert.iterators]的意义上。)
有一些障碍使其无法标准化。
map::insert_or_assign
没有一个value_type
(参考)参数,该参数在insert
,push_front
和push_back
中都是通用的。请记住,operator=
仅具有一个参数,因此您必须构造一对来分配给您的代理。
最好转发密钥和值中的一个或两个,如何区分通过const std::pair<const Key,Value> &
,std::pair<Key &&,const Value &>
等。
只有两个具有insert_or_assign
,map
和unordered_map
的标准容器。每个容器都有insert
,所有序列容器都有push_front
或push_back
中的一个或两个。