关于stl list :: splice

时间:2012-05-03 19:44:42

标签: g++

我面临着自己拼接列表的问题。请注意,我已经完成splice() on std::list and iterator invalidation 那里的问题是关于两个不同的清单。但我的问题是关于同一个清单。

mylist.splice(mylist.end(), mylist, ++mylist.begin());

似乎gcc 3.x使移动的迭代器无效。所以我想它是解除分配并再次分配节点。这对同一个列表没有意义。 SGI确实告诉此版本的拼接不应使任何迭代器无效。这是gcc 3.x的错误,如果有任何解决方法吗?

同时我正在浏览stl_list.h文件。但是使用transfer()函数,我找不到这些的定义。

struct _List_node_base
  {
    _List_node_base* _M_next;   ///< Self-explanatory
    _List_node_base* _M_prev;   ///< Self-explanatory

    static void
    swap(_List_node_base& __x, _List_node_base& __y);

    void
    transfer(_List_node_base * const __first,
         _List_node_base * const __last);

    void
    reverse();

    void
    hook(_List_node_base * const __position);

    void
    unhook();
  };

您知道我在哪里可以查找这些函数定义吗?

1 个答案:

答案 0 :(得分:0)

此函数位于libstdc ++源代码中,而不是头文件中。在3.4中它位于libstdc++-v3/src/list.cc

http://gcc.gnu.org/viewcvs/branches/gcc-3_4-branch/libstdc%2B%2B-v3/src/list.cc?view=markup

您是否尝试使用-D_GLIBCXX_DEBUG进行编译?这将启用调试模式,并告诉您是否使用无效迭代器或导致问题的任何其他因素。

我只是尝试使用GCC 3.4进行这个简单的测试,有和没有调试模式,它运行良好:

#include <list>
#include <iostream>
#include <string>

int main()
{
  std::list<std::string> l;
  l.push_back("1");
  l.push_back("2");
  l.push_back("3");
  l.push_back("4");
  l.push_back("5");
  l.push_back("6");
  l.splice(l.end(), l, ++l.begin());

  for (std::list<std::string>::iterator i = l.begin(), e = l.end(); i != e; ++i)
    std::cout << *i << ' ';
  std::cout << std::endl;
}

进一步修改并调试它我发现在进行拼接时没有元素被销毁和重新分配,所以我怀疑这个bug在你的程序中。很难知道,因为你实际上没有说出问题所在。