对一个关联容器调用 `insert( InputIt first, InputIt last )`,当 `first` 和 `last` 位于同一容器中时
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_type是 Cpp17EmplaceConstructible 能进入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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。