Доступ к элементам вектора внутри другого вектора через итератор? - PullRequest
1 голос
/ 27 февраля 2009
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);

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

Кто-нибудь хочет пролить свет на это?

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

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

Что не имеет большого смысла для меня.

Ответы [ 3 ]

6 голосов
/ 27 февраля 2009

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

Поэтому используйте &*iter, если хотите получить адрес вектора.

3 голосов
/ 27 февраля 2009

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

1) разыменовать итератор, например

Type t = *iter;

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

iter->someFuncOnTheContainerType();

1 голос
/ 27 февраля 2009

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

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

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

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

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

characters.begin() + i

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

...