我正面临着将列表与自身拼接的问题。注意,我已经浏览过splice() on std::list and iterator invalidation,那里的问题是关于两个不同的列表。但我的问题是关于同样的列表。
mylist.splice(mylist.end(), mylist, ++mylist.begin());看起来gcc 3.x正在使移动的迭代器失效。所以我认为它是重新分配和分配节点。这对于相同的列表是没有意义的。SGI告诉我们,这个版本的拼接不应该使任何迭代器无效。这是不是gcc 3.x的一个bug,如果有解决办法的话?
与此同时,我正在浏览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();
};你知道我在哪里可以找到这些函数定义吗?
发布于 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进行了这个简单的测试,有调试模式和不调试模式,都运行得很好:
#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。这很难知道,因为你实际上还没有说出问题是什么。
https://stackoverflow.com/questions/10438312
复制相似问题