2012-05-03 44 views
0

我面臨着與剪接的問題列表自身。請注意,我已經通過splice() on std::list and iterator invalidation 去那裏的問題是關於兩個不同的列表。但我的問題是關於同一個列表。關於STL目錄::拼接

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(); 
    }; 

你有什麼想法,我在哪裏可以找這些函數的定義?

回答

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是在你的程序中。很難知道,因爲你實際上沒有說出問題所在。