首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于stl list::splice

关于stl list::splice
EN

Stack Overflow用户
提问于 2012-05-04 03:44:42
回答 1查看 340关注 0票数 1

我正面临着将列表与自身拼接的问题。注意,我已经浏览过splice() on std::list and iterator invalidation,那里的问题是关于两个不同的列表。但我的问题是关于同样的列表。

代码语言:javascript
复制
mylist.splice(mylist.end(), mylist, ++mylist.begin());

看起来gcc 3.x正在使移动的迭代器失效。所以我认为它是重新分配和分配节点。这对于相同的列表是没有意义的。SGI告诉我们,这个版本的拼接不应该使任何迭代器无效。这是不是gcc 3.x的一个bug,如果有解决办法的话?

与此同时,我正在浏览stl_list.h文件。但是坚持使用transfer()函数,我找不到它们的定义。

代码语言:javascript
复制
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();
  };

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

EN

回答 1

Stack Overflow用户

发布于 2012-05-07 10:49:29

此函数位于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编译?这将启用Debug Mode,并告诉您是否使用了无效的迭代器或其他导致问题的东西。

我刚刚用GCC 3.4进行了这个简单的测试,有调试模式和不调试模式,都运行得很好:

代码语言:javascript
复制
#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。这很难知道,因为你实际上还没有说出问题是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10438312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档