std::list<>::splice 使迭代器失效。理由?



我想知道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 中都有描述。

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

最新更新