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

时间:2017-11-23 20:35:47

标签: c++ dictionary c++17

问题

在C ++ 17中,标准库中的关联容器将具有insert_or_assign成员函数,它将按照其名称建议。不幸的是,它似乎没有基于迭代器的接口进行批量插入/分配。我甚至是tried to compile小例子,并且从编译器错误中,编译器找不到合适的重载,并且这两个候选者都没有合理地接近基于迭代器的接口。

问题

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

我的假设和想法

我没有看到任何技术原因不添加基于迭代器的批量插入/添加。这看起来很可行。无论如何它需要查找密钥,所以我没有看到任何违反“不要为你不使用的东西买单”的行为。

实际上没有过载使得标准库不那么一致,并且有点违背自己。简单insert支持它,所以我希望insert_or_assign也支持它。我不认为没有过载会使它“更容易正确使用,更难以正确使用”。

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

  

insert_or_assign返回的信息比operator []多,并且不需要映射类型的默认构造。

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

如果我没有忘记任何事情,二进制兼容性在这里不适用。修改将在标题中,无论如何都需要重新编译。

我也找不到任何相关的纸张。拼接地图和集合似乎没有提到它。该功能看起来像一个幻像。

标准至少可以包含insert_assign_iterator,因此可以写std::copy(input_first, input_last, insert_assign_iterator{map});,但标准不包括。{/ p>

1 个答案:

答案 0 :(得分:5)

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

你所谈论的是类似的,但却不同。您有一些键值对,并且您希望将所有这些值都粘贴到地图中,无论它们是否具有等效键。这不是创建这些函数来解决的问题,as evidenced by the original proposal for them

并不是说他们一定是个坏主意。它根本不是解决函数添加的问题。