【问题标题】:About stl list::splice关于 stl list::splice
【发布时间】:2012-05-13 09:03:19
【问题描述】:

我遇到了将列表与自身拼接的问题。请注意,我已经通过splice() on std::list and iterator invalidation 问题是关于两个不同的列表。但我的问题是关于同一个列表。

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

gcc 3.x 似乎使移动的迭代器无效。所以我想它正在重新分配和分配节点。这对于同一个列表没有意义。 SGI 确实告诉这个版本的 splice 不应该使任何迭代器失效。如果有任何解决方法,这是 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();
  };

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

【问题讨论】:

    标签: g++


    【解决方案1】:

    此函数位于 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-05
      • 2010-09-13
      • 2017-02-27
      • 2012-05-09
      • 2010-09-15
      • 2020-05-26
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多