Перекресные ссылки в STL list.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
DenLu
Сообщения: 7
Зарегистрирован: 22 окт 2004, 14:03

22 окт 2004, 14:22

Расскажите плз, как связать друг с другом два списка STL.

Подробнее в программе описаны списки:

std::list<Object> lstV1,lstV2;


Нужно иметь возможность при проходе одного из списков от начала
переходить на некоторый элемент другого списка и продолжать обход, но уже в другом списке и с указанного места. См картинку (Нужно пройти по элементам, набранным верхним регистром)

lstV1: |ELEM1|->|ELEM2|->|elem3|->...|ELEM12|->|ELEM13|..->|elemn|
............................. |_______.................... __|
.............................................|................. |
lstV2: |elem1|->|elem2|->|ELEM3|->|ELEM4|->.........->|elemn|


Вопрос в том, как обеспечить СВЯЗЬ между списками...

Заранее спасибо.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

22 окт 2004, 14:40

Можно ввести дополнительную интовскую переменную и считать сколько ты прошел эдементов.
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.
Но не проще ли эти списки сразу создавать такими, как надо ??
В SAD - все в SAD.
DenLu
Сообщения: 7
Зарегистрирован: 22 окт 2004, 14:03

22 окт 2004, 14:53

Kolinus писал(а):Можно ввести дополнительную интовскую переменную и считать сколько ты прошел эдементов.
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.
Не хотелось бы... потеря времени, а оно важно.
Нельзя ли в объектах ( элементах списка) напрямую хранить значение ИТЕРАТОРА?

Kolinus писал(а):
Но не проще ли эти списки сразу создавать такими, как надо ??
Рад бы ;)) Но в том и суть. Задача о пересечении полигонов. Списки -- узлы двух полигонов (включая точки пересечения). Переход -- в узле пересечения для выделения полигона пересечения :)
DenLu
Сообщения: 7
Зарегистрирован: 22 окт 2004, 14:03

22 окт 2004, 14:57

Да, еще мысля...

Вот если бы не стлевский список, а свой был, я бы просто хранил в элементах списка указатель на элемент другого списка.

Нет ли возможности как-нибудь похожим образом поступить для std::list?
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

22 окт 2004, 15:15

а почему нет ???
ты в списки клади не объекты а указатели на них и все
В SAD - все в SAD.
DenLu
Сообщения: 7
Зарегистрирован: 22 окт 2004, 14:03

22 окт 2004, 15:22

Kolinus писал(а):а почему нет ???
ты в списки клади не объекты а указатели на них и все
Указатель должен быть не на ОБЪЕКТ (будь то сам объект, или указатель на него), хранящийся в элементе списка, а на САМ ЭЛЕМЕНТ
списка...(Чтобы обеспечить связь со следующими эл-тами) Так что храниение в списке указателей на объекты ничем не поможет. :)
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

25 окт 2004, 14:22

Итератор - это и есть "указатель" на элемент списка. Его-то и надо хранить.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
DenLu
Сообщения: 7
Зарегистрирован: 22 окт 2004, 14:03

27 окт 2004, 16:00

Romeo писал(а):Итератор - это и есть "указатель" на элемент списка. Его-то и надо хранить.
Однако, даже не компилится ] list.h(110): E2450 Undefined structure 'CGraphVertex'

в файле list.h в объявлении класса list:

class list
{
protected:
struct __list_node;
struct __list_node_buffer;
friend struct __list_node;
friend struct __list_node_buffer;

#ifdef _RWSTD_ALLOCATOR
typedef _TYPENAME Allocator::template rebind<__list_node>::other __list_node_alloc_type;
typedef _TYPENAME Allocator::template rebind<T>::other __value_alloc_type;
typedef _TYPENAME Allocator::template rebind<__list_node_buffer>::other __buffer_alloc_type;
#else
typedef allocator_interface<Allocator,__list_node> __list_node_alloc_type;
typedef allocator_interface<Allocator,T> __value_alloc_type;
typedef allocator_interface<Allocator,__list_node_buffer> __buffer_alloc_type;
#endif // _RWSTD_ALLOCATOR

public:
//
// types
//
typedef _TYPENAME __value_alloc_type::reference reference;
typedef _TYPENAME __value_alloc_type::const_reference const_reference;
typedef _TYPENAME __value_alloc_type::size_type size_type;
typedef _TYPENAME __value_alloc_type::difference_type difference_type;
typedef T value_type;
typedef Allocator allocator_type;
typedef _TYPENAME __value_alloc_type::pointer pointer;
typedef _TYPENAME __value_alloc_type::const_pointer const_pointer;

protected:
typedef _TYPENAME __list_node_alloc_type::pointer __link_type;
typedef _TYPENAME __buffer_alloc_type::pointer __buffer_pointer;

struct __list_node
{
__link_type next;
__link_type prev;
>>>> T data; /// Вот здесь
};
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

27 окт 2004, 17:55

Однако, даже не компилится ;)

Код: Выделить всё

class CGraphVertex : public CVertex 
{ 
public: 
std::list<CGraphVertex>::iterator it_othergraph; // This var. is used to 
//make reference to the other graph. 
};
Объяви it_othergraph типа void*, а перед использованием приводи к типу итератора.
DenLu
Сообщения: 7
Зарегистрирован: 22 окт 2004, 14:03

27 окт 2004, 18:24

Eugie писал(а):
Однако, даже не компилится ]
class CGraphVertex : public CVertex
{
public:
std::list<CGraphVertex>::iterator it_othergraph; // This var. is used to
//make reference to the other graph.
[/code]
};
Объяви it_othergraph типа void*, а перед использованием приводи к типу итератора.
Похоже, это решение. По крайней мере, уже скомпилилось... Дальше надо смотреть. Спасибо огромное :)
Ответить