对一个关联容器调用 `insert( InputIt first, InputIt last )`,当 `first` 和 `last` 位于同一容器中时

编程语言 2026-07-12
std::unordered_multiset<int> set({1, 2});
set.insert(set.begin(), set.end());
for(int x: set) 
    std::cout << x << ' ';

打印 1 2 2
我期望得到 1 1 2 2 的一个排列。
这段代码是未定义行为,还是实现中的一个错误?
标准中没有找到该函数的前置条件。

解决方案

这是未定义行为。标准要求传递给 insert 的迭代器不得来自被插入的容器。

来自 当前草案 [unord.req.general]#106-109(以下为强调部分):

a.insert(i, j)
结果: void
前提条件: value_typeCpp17EmplaceConstructible 能进入 X,自 *i
既不是 i 也不是 j 的迭代器,指向 a
效果: 对 [i, j) 中的每个元素等价于 a.insert(t)
复杂度: 平均情况 O(N),其中 N(i, j) 的距离,最坏情况为 O(N(a.size()+1))。

其中

  • X 表示一个无序关联容器类
  • a 表示一个类型为 X 的值,
  • [i, j) 表示一个有效的范围,
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章