2009-02-27 4 views
1
std::vector< std::vector<coords> >::iterator iter; 
for(iter = characters.begin(); iter != characters.end(); iter++) 
{ 
    std::vector<coords>* cha = iter; // doesn't work. 
} 

// does work. 
std::vector<coords>* character = &characters.at(0); 
coords* first = &character->at(0); 

И я не понимаю почему. Разве он не должен быть указателем на элемент типа, который должен содержать контейнер?Доступ к векторным элементам внутри другого вектора через итератор?

Любой желающий пролить свет на это?

К не работает, я имею в виду:

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *' 

Который не делает много смысла для меня.

ответ

6

Итератор является типом, который может быть разыменован как указатель, то есть он имеет явные operator*() и operator->(). Это не должно быть указателем.

Для того, чтобы получить адрес вектора, используйте &*iter.

3

Чтобы подробнее разъяснить ответ MSN, вы можете рассматривать итератор как обертку для отдельного элемента контейнера, но также имеет некоторые умения для приращения (++ iter), декремент (++ iter) и т. Д. Помните, что базовая структура данных может не быть непрерывным блоком памяти в зависимости от типа контейнера/реализации. Чтобы получить доступ к фактической стоимости, вы можете

1) derefence итератора, например

Type t = *iter;

2) рассматривать итератор как указатель на тип контейнера, например

iter->someFuncOnTheContainerType();

1

Я знаю, что это очевидно сейчас (задним числом), но в вашей петле можно также попробовать:

std::vector<coords> & cha = * iter; 

Также не то, что вы просите, а просто FYI, но векторы поддерживают итераторы произвольного доступа. Смысл можно было бы написать:

for(size_t i=0; i<characters.size(); i ++) 

И, если вам необходимо преобразовать обратно в итератора, вы можете использовать:

characters.begin() + i 

Это не так, как C++ делать вещи, он нарушает общий итератор философия, но она имеет свое применение.

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