c++ - 为什么 insert_or_assign 没有迭代器重载?

标签 c++ dictionary c++17

问题

在 C++17 中,标准库中的关联容器将具有 insert_or_assign 成员函数,该函数将执行其名称所暗示的操作。不幸的是,它似乎没有用于批量插入/分配的基于迭代器的接口(interface)。我什至tried to compile小例子,从编译器错误来看,编译器找不到合适的重载,而且两个候选者都不太接近基于迭代器的接口(interface)。

问题

为什么 C++17 不包含基于迭代器的 insert_or_assign 以进行批量操作?有什么技术原因吗?设计问题?

我的假设和想法

我看不出有任何技术原因不添加基于迭代器的批量插入/添加。这似乎很可行。它无论如何都需要查找 key ,所以我没有看到任何违反“不要为你不使用的东西付费”的行为。

实际上没有重载会使标准库不那么一致,并且有点自相矛盾。 Plain insert 支持它,所以我希望 insert_or_assign 也支持它。我不认为没有过载会使它“更容易正确使用,更难错误使用”。

剩下的唯一线索是来自 cppreference 的通知:

insert_or_assign returns more information than operator[] and does not require default-constructibility of the mapped type.

我不确定为什么这可能是一个限制,因为关联容器可以访问所有内部结构并且根本不需要处理 operator[]

二进制兼容性在这里不适用,如果我没忘记的话。修改将在 header 中,无论如何都需要重新编译。

我也找不到任何相关论文。拼贴图和集合好像没提。该特征看起来像一个幻影。

标准至少可以包含 insert_assign_iterator,这样就可以编写 std::copy(input_first, input_last, insert_assign_iterator{map});,但标准两者都不包含。

最佳答案

insert_or_emplace 旨在成为执行 some_map[key] = value; 的更好形式。后者要求 mapped_type 是默认可构造的,而 insert_or_emplace 不是。

你说的是相似的,但又不同。您有一定范围的键值对,并且您希望将所有这些值粘贴到映射中,无论它们是否具有等效键。这不是创建这些函数来解决的问题,as evidenced by the original proposal for them .

这并不是说它们一定是个坏主意。这根本不是添加该功能要解决的问题。

关于c++ - 为什么 insert_or_assign 没有迭代器重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47462946/

相关文章:

python - 如何将多个元素作为值附加到字典中

c++ - 将文件读入 std::vector<std::byte>

c++ - 使接受可选的函数接受非可选的函数?

c++ - 错误 : anachronistic old-style base class initializer

java - 使用 FFMpeg 将 BGR BufferedImage 快速转换为 YUV

c++ - C++ 代码中的大负输出

c++ - 多线程实现中的errno

python - Python 字典哈希查找是如何工作的?

dictionary - Clojure - 沿着路径行走

c++ - 如何在构造函数中构造预定义的随机数生成器和种子序列?