C ++ 20中是否有assign_or_inserter / insert_or_assigner? C ++ 20标准库中没有具有insert_or_assign功能的插入迭代器

问题描述

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_­inserterfront_­inserterinserter是使插入迭代器脱离容器的三个函数。 [...]

分别为back_­inserterfront_­inserterinserter,分别由[back.inserter][front.inserter][inserter]覆盖,它们返回{分别为{1}},back_insert_iteratorfront_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(参考)参数,该参数在insertpush_frontpush_back中都是通用的。请记住,operator=仅具有一个参数,因此您必须构造一对来分配给您的代理。

最好转发密钥和值中的一个或两个,如何区分通过const std::pair<const Key,Value> &std::pair<Key &&,const Value &>等。

只有两个具有insert_or_assignmapunordered_map的标准容器。每个容器都有insert,所有序列容器都有push_frontpush_back中的一个或两个。