Консультация № 66425
10.12.2006, 23:33
0.00 руб.
0 2 1
STL - вопрос из темноты
вопрос практический и теоретический.
есть список элементов обычный list и другой такой же , с таким же типом элементов.
Нужно сделать перекрёстные связи между двумя списками :
- например иду по одному листу вниз c front() дохожу до элемента
который "связан" с другим в дргом списке и дальше иду по другому списку
стандартными средствами ,как я понял, можно только добавить удалить
вставить из одного списка в другой.
что хочу:
например
список-а а1-а2-а3-а4-а5-а6-а7-а8
список-б б1-б2-б3-б4-б5-б6-б7-б8-б9
иду по списку а (модифицированному)
а1-а2-б4-б5-а7-б9
(ну поскольку листы однотипны то вероятно можно перекинуть связь
из одного в другой)

вопросы:
1 можно ли изменить итератор (он хранится внутри или
или иммеет чисто информативный характер
облазил list.h но увы, запутался - куча наследований )
1а можноли сделать контейнер итераторов?
2. есть ли возможность реализовать затею через stl может без листа.
(чем нибудь другим)
3 реальна ли моя затея без изменения исходного текста stl ?
4. подскажите инструмент для изучения исходных текстов
(чтобы например как в IDA - дерево вызовов) +дерево классов

Спасибо за внимание

Приложение:
фрагмент stltemplate<class _Tp, class _Ref, class _Ptr>struct _List_iterator : public _List_iterator_base { typedef _List_iterator<_Tp,_Tp&,_Tp*> iterator; typedef _List_iterator<_Tp,const _Tp&,const _Tp*> const_iterator; typedef _List_iterator<_Tp,_Ref,_Ptr> _Self; typedef _Tp value_type; typedef _Ptr pointer; typedef _Ref reference; typedef _List_node<_Tp> _Node; _List_iterator(_Node* __x) : _List_iterator_base(__x) {} _List_iterator() {} _List_iterator(const iterator& __x) : _List_iterator_base(__x._M_node) {} reference operator*() const { return ((_Node*) _M_node)->_M_data; }#ifndef __SGI_STL_NO_ARROW_OPERATOR pointer operator->() const { return &(operator*()); }#endif /* __SGI_STL_NO_ARROW_OPERATOR */ _Self& operator++() { this->_M_incr(); return *this; } _Self operator++(int) { _Self __tmp = *this; this->_M_incr(); return __tmp; } _Self& operator--() { this->_M_decr(); return *this; } _Self operator--(int) { _Self __tmp = *this; this->_M_decr(); return __tmp; }};

Обсуждение

Неизвестный
11.12.2006, 11:23
общий
это ответ
Здравствуйте, Mixffff!

1) нет
1.а) а зачем ?
2) да, см. ниже.
3) конечно, изменение исходных текстов библиотек (и stl в том числе) нигде не приветствуется, как правило это не просто плохой стиль программирования, а очень плохой.
4) не знаю, не видел того что есть в IDA.

Что касается вопроса. У списков есть специальные предусмотренные для этого функции врезки. Они как раз и делают то что тебе нужно - переназначают внутренние указатели в списках.
list1.splice(pos, list2, iter_start, iter_end) - перемещает все элементы из интервала обозначенного итераторами iter_start, iter_end из list 2 в list1, перед позицией итератора pos в списке list1.
Это самый универсальный splice - там есть еще несколько перегруженных подобных функций.

В этом случае он переназначит указатели, и 2-ой список останется уже без этих элементов, которые были перенесены в 1-ый.
Неизвестный
11.12.2006, 12:23
общий
спасиба, 1. как представлен сам список - как список "итераторов"(или подобных) или нет?splice ....но это всёравно что перекинуть указатели ,получается что нужно переписывать(перемещать) кажждый раз весь лист начиная с той позиции на которую ссылаюсь (вероятно , из меняются при этом 2 указателя донора, 2 приёмника, 2 переписыаемого диапазона), мне бы хотелось изменить только 1 указатель приёмника (на ту позицию после которого ссылка в другой лист,) как бы это ... тут нуужно что-тонестандартное2. А какие вообще есть анализаторы исходных текстов?
Форма ответа