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


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

我理解可能存在一些基于迭代器可达性等概念的纯学术考虑因素。但同时也是如此 splice 是一个 std::list特定的操作,意味着为它提供定制的规范可能不会对STL设计造成严重的概念损害。

那是什么?它会使一些实际的实现失效或过于复杂吗? std::list,我没认识到?


8234
2017-07-05 21:20


起源

可能重复 spled()on std :: list和iterator invalidation - jwismar


答案:


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


8
2017-07-05 21:29



哦好的。刚发现。因此,显然没有充分理由要求无效宣告。我的问题主要发生在看到微软必须在他们的STL实现中跳过多少箍和循环以便为两者提供“迭代器调试”支持 swap 和 splice。感谢你的回答。 - AnT
@AndreyT“因此,显然没有充分理由要求无效宣告。“不是真的。在某些时候,委员会希望得到全力支持 不等 内存分配器,这些分配器不兼容,因此需要进行一些复制 这个非常特殊的情况。 - curiousguy


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


4
2017-08-11 00:42