std :: list<> :: splice使迭代器无效。什么道理呢?

时间:2012-07-05 21:20:31

标签: c++ stl iterator invalidation

我想知道使std::list<>::splice使引用新子容器中的子序列的迭代器无效的原因是什么。这看起来有点不合逻辑,特别是在标准std::container::swap规范的基础上。根据语言标准std::container::swap不会使任何迭代器无效。这是一个非常合理的实用规范。但是,我会说std::list<>::splice也会从保留迭代器的行为中受益匪浅。

我理解可能存在基于迭代器可达性等概念的纯粹学术考虑因素。但同时splicestd::list特定的操作,意味着提供自定义 - 它的定制规范可能不会对STL设计造成严重的概念上的损害。

那是什么?是否会使std::list的一些实际实现失效或过于复杂,我无法识别?

2 个答案:

答案 0 :(得分:8)

在C ++ 11中splice不会使迭代器失效,而是让它们引用*this容器中的相应元素。这一切都在23.3.5.5中描述。

答案 1 :(得分:4)

如果容器有自定义的不等(不兼容)分配器,你就无法交换指针,你别无选择,只能真正复制元素。

相关问题