12

的 3 参数形式list::splice()将单个元素从一个列表移动到另一个列表。 SGI 的文档明确指出所有迭代器,包括指向被移动元素的迭代器仍然有效。 Roguewave 的文档没有说明splice()方法的迭代器失效属性,而 C++ 标准明确声明它使所有迭代器和对被拼接元素的引用失效。

splicing() 在实践中按照 SGI 的定义工作,但在微软 STL 实现的调试/安全 SCL 版本(严格遵循标准的字母)中出现断言失败(取消引用无效迭代器)。

现在,我使用 list 正是因为我想在列表之间移动一个元素,同时保留指向它的迭代器的有效性。该标准对原始 SGI 的规范进行了极其无益的更改。

我该如何解决这个问题?或者我应该务实一点,把头埋在沙子里(因为在实践中拼接不会使迭代器失效——即使在 MS 的实现中,一旦迭代器调试被关闭)。

4

3 回答 3

11

好的,根据这个这个链接,这似乎是标准中的一个缺陷。似乎“把头埋在沙子里”是一个好策略,因为它将在新的库版本中得到修复。

于 2008-09-27T07:05:05.643 回答
2

问题是如果迭代器仍然指向被移动的元素,那么之前与“移动”迭代器关联的“结束”迭代器已经改变。除非您编写一些复杂的循环,否则这实际上是一件坏事——尤其是因为其他开发人员更难以理解。

我认为更好的方法是使用指向移动迭代器之前和之后元素的迭代器。

于 2008-09-27T07:10:29.920 回答
0

我有一个列表数组(元素的等效类),并且我正在使用 splice 在列表之间移动元素。我有一个额外的迭代器数组,可以让我直接访问任何列表中的任何元素并将其移动到另一个列表。不会同时搜索和修改任何列表。我可以在拼接后重新初始化元素迭代器,但这有点难看。我想我暂时会这样做。

于 2008-09-27T10:55:16.293 回答