代码之家  ›  专栏  ›  技术社区  ›  zvrba

std::list上的splice()和迭代器无效

  •  10
  • zvrba  · 技术社区  · 16 年前

    三元形式 list::splice() SGI's documentation 显式声明所有迭代器, 保持有效。 Roguewave's documentation splice() 方法,而C++标准明确声明,它对所有被拼接的元素的迭代器和引用无效。

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

    我怎样才能解决这个问题?还是我应该务实一点,把头埋在沙子里(因为拼接确实如此 在实践中使迭代器无效(即使在MS的实现中,一旦迭代器调试关闭,也不会)。

    3 回复  |  直到 14 年前
        1
  •  11
  •   zvrba    16 年前

    好吧,这似乎是标准中的一个缺陷,根据 this this

        2
  •  2
  •   Kevin    16 年前

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

        3
  •  0
  •   zvrba    16 年前

    我有一个列表数组(元素的等价类),我使用splice在列表之间移动元素。我有一个额外的迭代器数组,它允许我直接访问任何列表中的任何元素,并将其移动到另一个列表中。不会同时搜索和修改任何列表。我