问题描述
|
给定分配器
a1
和a2
,其中a1
!=a2
,
和std::vector
的v1(a1)
和v2(a2)
然后ѭ7使所有迭代器无效。
这是预期的行为吗?
解决方法
通常,
swap
永远不会使迭代器无效。但是,当分配器不同时,另一个规则也会起作用。在这种情况下,行为取决于ѭ9和ѭ10。如果两者都为真,则分配器与数据一起交换,所有迭代器保持有效。如果其中一个为假,则行为是不确定的,因此允许VC ++ 2010展示特定行为。
从[container.requirements.general]
起(字词来自n3290):
仅当allocator_traits<allocatortype>::propagate_on_container_copy_assignment::value
时,才通过复制分配,移动分配或交换分配器来执行分配器替换,
在相应的容器操作的实现中,ѭ13或or14是正确的。除非正在交换的对象具有比较等于或“ 14”为真的分配器,否则调用容器交换函数的行为是不确定的。
和
在交换之前,每个迭代器在一个容器中引用一个元素,在交换之后,每个迭代器应在另一个容器中引用相同的元素
和
除非另有说明,否则没有任何swap()
函数会使引用被交换容器的元素的任何引用,指针或迭代器无效。
23.3.6.5没有为“ 17”指定替代规则。