我想知道std::list<>::splice
使引用子序列被拼接到新容器中的迭代器无效背后的理由是什么。这对我来说看起来有点不合逻辑,尤其是考虑到标准std::container::swap
规范。根据语言标准std::container::swap
不会使任何迭代器无效。这是一个完全合理的实用规范。但是,我想说std::list<>::splice
也会从迭代器保留行为中受益匪浅。
我知道可能会有一些基于迭代器可访问性等概念的纯粹学术考虑。但与此同时,splice
是一个特定于std::list
的操作,这意味着为其提供定制的规范可能不会对 STL 设计造成严重的概念损害。
那是什么呢?它会禁止或过于复杂一些我无法认识到的std::list
的实际实现吗?
在 C++11 中,splice
不会使迭代器失效,而是使它们引用*this
容器中的相应元素。这在 23.3.5.5 中都有描述。
如果容器具有自定义的、不相等(不兼容)的分配器,则无法交换指针,您别无选择,只能真正复制元素。