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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Перекресные ссылки в STL list.

DenLu » 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*, а перед использованием приводи к типу итератора.
Похоже, это решение. По крайней мере, уже скомпилилось... Дальше надо смотреть. Спасибо огромное :)

Eugie » 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 » 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; /// Вот здесь
};

Romeo » 25 окт 2004, 14:22

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

DenLu » 22 окт 2004, 15:22

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

Kolinus » 22 окт 2004, 15:15

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

Добавка

DenLu » 22 окт 2004, 14:57

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

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

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

DenLu » 22 окт 2004, 14:53

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

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

Kolinus » 22 окт 2004, 14:40

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

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

DenLu » 22 окт 2004, 14:22

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

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

std::list<Object> lstV1,lstV2;


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

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


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

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

Вернуться к началу