PDA

Просмотр полной версии : Перекресные ссылки в STL list.



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

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

std::list<Object> lstV1,lstV2;


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

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


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

Заранее спасибо.

Kolinus
22.10.2004, 14:40
Можно ввести дополнительную интовскую переменную и считать сколько ты прошел эдементов.
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.
Но не проще ли эти списки сразу создавать такими, как надо ??

DenLu
22.10.2004, 14:53
Можно ввести дополнительную интовскую переменную и считать сколько ты прошел эдементов.
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.



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





Но не проще ли эти списки сразу создавать такими, как надо ??

Рад бы ;)) Но в том и суть. Задача о пересечении полигонов. Списки -- узлы двух полигонов (включая точки пересечения). Переход -- в узле пересечения для выделения полигона пересечения :)

DenLu
22.10.2004, 14:57
Да, еще мысля...

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

Нет ли возможности как-нибудь похожим образом поступить для std::list?

Kolinus
22.10.2004, 15:15
а почему нет ???
ты в списки клади не объекты а указатели на них и все

DenLu
22.10.2004, 15:22
а почему нет ???
ты в списки клади не объекты а указатели на них и все

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

Romeo
25.10.2004, 14:22
Итератор - это и есть "указатель" на элемент списка. Его-то и надо хранить.

DenLu
27.10.2004, 16:00
Итератор - это и есть "указатель" на элемент списка. Его-то и надо хранить.

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

class CGraphVertex : public CVertex
{
public:
std::list<CGraphVertex>::iterator it_othergraph; // This var. is used to
//make reference to the other graph.

};

по идее, it_othergraph должен хранить ссылку на элемент другого списка.... однако, код не компилируется. выдает ошибку:

[C++ Error] 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
27.10.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
27.10.2004, 18:24
Однако, даже не компилится ;)


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*, а перед использованием приводи к типу итератора.

Похоже, это решение. По крайней мере, уже скомпилилось... Дальше надо смотреть. Спасибо огромное :)