2012-05-03 9 views
0

私はリストをスプライシングする際に問題が発生しています。私が行ったことに注意してくださいsplice() on std::list and iterator invalidation 質問は2つの異なるリストについてでした。しかし、私の質問は同じリストです。stl list :: spliceについて

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では、それはあなたが-D_GLIBCXX_DEBUGでコンパイルしようとしたことがありlibstdc++-v3/src/list.cc

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

には?そうすれば、デバッグモードが有効になり、無効なイテレーターなどを使用しているかどうかを知ることができます。

私はデバッグモードでとせずに、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; 
} 

はさらにそれを変更し、それをデバッグ、私がやったときにどの要素が破壊されておらず、再割り当てされていることがわかり私はバグがあなたのプログラムにあると思う。あなたが実際に問題が何であるかを言っていないので、知るのは難しいです。

関連する問題