Доступ к векторным элементам внутри другого вектора через итератор?

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> *'

Что не делает много смысла для меня.

Ответ на: "Доступ к векторным элементам внутри другого вектора через итератор?"

Количество ответов:3

Итератор является типом, который может быть dereferenced как указатель, т.е. он имеет явный operator*() and и operator->(). It doesn't have to be a pointer. . Это не должно быть указателем.

Так что используйте &*iter if you want to get the address of the vector. если вы хотите получить адрес вектора.

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

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

Type t = *iter;

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

iter->someFuncOnTheContainerType();

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

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

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

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

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

characters.begin() + i

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