【发布时间】:2010-09-13 16:15:03
【问题描述】:
list::splice() 的 3 参数形式将单个元素从一个列表移动到另一个列表。 SGI's documentation 明确声明所有迭代器,包括指向被移动元素的迭代器仍然有效。 Roguewave's documentation 没有说明 splice() 方法的迭代器失效属性,而 C++ 标准明确声明它使所有迭代器和对被拼接元素的引用失效。
splicing() 在实践中按照 SGI 的定义工作,但在微软 STL 实现的调试/安全 SCL 版本(严格遵循标准的字母)中出现断言失败(取消引用无效迭代器)。
现在,我使用 list 正是因为我想在列表之间移动一个元素,同时保持指向它的迭代器的有效性。该标准对原始 SGI 规范做出了极其无益的更改。
我该如何解决这个问题?或者我应该务实一点,把头埋在沙子里(因为拼接确实不会在实践中使迭代器失效——即使在 MS 的实现中,一旦迭代器调试被关闭)。
【问题讨论】:
-
好问题。最后一句话是什么?
-
标准是愚蠢的,但是正确的。不要在符合标准的程序中使用拼接。也许 C++1x 修正了这种情况;我没有检查。
-
我刚查了一下,确实有变化。保留的措辞是 LWG 缺陷 250 之一:旧迭代器是有效的,并且表现得好像它们指向新容器一样。
标签: c++ list containers iterator