Расскажите плз, как связать друг с другом два списка STL.
Подробнее в программе описаны списки:
std::list<Object> lstV1,lstV2;
Нужно иметь возможность при проходе одного из списков от начала
переходить на некоторый элемент другого списка и продолжать обход, но уже в другом списке и с указанного места. См картинку (Нужно пройти по элементам, набранным верхним регистром)
lstV1: |ELEM1|->|ELEM2|->|elem3|->...|ELEM12|->|ELEM13|..->|elemn|
............................. |_______.................... __|
.............................................|................. |
lstV2: |elem1|->|elem2|->|ELEM3|->|ELEM4|->.........->|elemn|
Вопрос в том, как обеспечить СВЯЗЬ между списками...
Заранее спасибо.
Перекресные ссылки в STL list.
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Можно ввести дополнительную интовскую переменную и считать сколько ты прошел эдементов.
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.
Но не проще ли эти списки сразу создавать такими, как надо ??
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.
Но не проще ли эти списки сразу создавать такими, как надо ??
В SAD - все в SAD.
Не хотелось бы... потеря времени, а оно важно.Kolinus писал(а):Можно ввести дополнительную интовскую переменную и считать сколько ты прошел эдементов.
Потом брать из второго списка итератор проходить столько же раз сколько прошел по первому и после этого начать анализировать данные.
Нельзя ли в объектах ( элементах списка) напрямую хранить значение ИТЕРАТОРА?
Рад бы ;)) Но в том и суть. Задача о пересечении полигонов. Списки -- узлы двух полигонов (включая точки пересечения). Переход -- в узле пересечения для выделения полигона пересечения :)Kolinus писал(а):
Но не проще ли эти списки сразу создавать такими, как надо ??
Да, еще мысля...
Вот если бы не стлевский список, а свой был, я бы просто хранил в элементах списка указатель на элемент другого списка.
Нет ли возможности как-нибудь похожим образом поступить для std::list?
Вот если бы не стлевский список, а свой был, я бы просто хранил в элементах списка указатель на элемент другого списка.
Нет ли возможности как-нибудь похожим образом поступить для std::list?
а почему нет ???
ты в списки клади не объекты а указатели на них и все
ты в списки клади не объекты а указатели на них и все
В SAD - все в SAD.
Указатель должен быть не на ОБЪЕКТ (будь то сам объект, или указатель на него), хранящийся в элементе списка, а на САМ ЭЛЕМЕНТKolinus писал(а):а почему нет ???
ты в списки клади не объекты а указатели на них и все
списка...(Чтобы обеспечить связь со следующими эл-тами) Так что храниение в списке указателей на объекты ничем не поможет. :)
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Итератор - это и есть "указатель" на элемент списка. Его-то и надо хранить.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Однако, даже не компилится ] list.h(110): E2450 Undefined structure 'CGraphVertex'Romeo писал(а):Итератор - это и есть "указатель" на элемент списка. Его-то и надо хранить.
в файле 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; /// Вот здесь
};
Объяви it_othergraph типа void*, а перед использованием приводи к типу итератора.Однако, даже не компилится};Код: Выделить всё
class CGraphVertex : public CVertex { public: std::list<CGraphVertex>::iterator it_othergraph; // This var. is used to //make reference to the other graph.
Похоже, это решение. По крайней мере, уже скомпилилось... Дальше надо смотреть. Спасибо огромное :)Eugie писал(а):Объяви it_othergraph типа void*, а перед использованием приводи к типу итератора.Однако, даже не компилится ]
class CGraphVertex : public CVertex
{
public:
std::list<CGraphVertex>::iterator it_othergraph; // This var. is used to
//make reference to the other graph.
[/code]
};