2012-05-03 1 views
0

У меня возникла проблема с сплайсингом списка с самим собой. Заметьте, что я прошел через splice() on std::list and iterator invalidation Там вопрос был о двух разных списках. Но мой вопрос касается того же списка.О 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 это в 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; 
} 

Изменение его дальше и отладка его я вижу, что ни один элемент не разрушается и перераспределяется при выполнении сращивание, поэтому я подозреваю, что ошибка в вашей программе. Трудно понять, поскольку вы на самом деле не сказали, в чем проблема.