在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>
答案 0 :(得分:5)
insert_or_emplace
旨在成为更好的some_map[key] = value;
形式。后者要求mapped_type
是默认可构造的,而insert_or_emplace
则不是。
你所谈论的是类似的,但却不同。您有一些键值对,并且您希望将所有这些值都粘贴到地图中,无论它们是否具有等效键。这不是创建这些函数来解决的问题,as evidenced by the original proposal for them。
并不是说他们一定是个坏主意。它根本不是解决函数添加的问题。