2009-07-21 3 views
0

Я хотел бы создать два контейнера, которые содержат итераторы друг к другу. Я бы хотел сделать это, не внося никаких промежуточных/косвенных типов. Является ли это возможным или имеет тип итератора в зависимости от знания размера типа данных контейнера?Контейнер итераторов C++ и циклические ссылки

Ниже приведен пример кода, который я хотел бы получить компиляции:

#include <map> 
#include <deque> 
#include <string> 

class mapvalue_t 
{ 
    public: 
    std::deque< std::map<std::string,mapvalue_t>::iterator >::iterator i; 
}; 

typedef std::map<std::string,mapvalue_t> maptype_t; 
typedef std::deque<maptype_t::iterator> queuetype_t; 

int main(void) 
{ 
    maptype_t m; 
    queuetype_t q; 
} 

Ничего, он компилирует прямо сейчас. У меня была очередь там, а не мой предполагаемый deque :)

+1

Я не уверен, что вы редактируете свой вопрос, чтобы не быть вопросом, является хорошей практикой. –

ответ

2

Это работает, если вы используете deque вместо queue. Queue не контейнер, а фасад, поэтому он не поддерживает вызов ::iterator.

От cplusplus.com:

очередь реализована в виде контейнеров адаптеров, которые являются классами, которые используют инкапсулированный объект определенного класса контейнера в качестве своего основного контейнера, обеспечивая определенный набор функций-членов для доступа к нему элементам. Элементы вставляются в «спину» конкретного контейнера и выталкиваются из «фронта».

1

Вы должны быть очень осторожны при хранении итераторов. Изменение коллекции может привести к недействительности всех итераторов. Вам будет гораздо лучше хранить идентификатор или управляемый указатель.

+0

Действительно. Ваш сохраненный список итераторов будет аннулирован каждый раз, когда карта будет изменена каким-либо образом. Вы должны хранить значения ключей для сопоставления. – Kieveli

+0

Не совсем верно. Для отображения карты и списка вставка и удаление элементов не приводит к аннулированию любых итераторов (за исключением, конечно, для удаляемого). В моем вопросе должен быть список, а не детекс, но я не знаю, должен ли я еще раз обновить вопрос. – Alex77

+0

Если мы полагаемся на конкретные реализации. Я не думаю, что это гарантировано стандартом. – DanDan

Смежные вопросы