Я создаю функцию, которая рекурсивно находит структуры внутри структур. Я создаю list < list <struct> >
а затем вызываю функцию, которая находит первый list <struct>
и выталкивает его обратно в список. Мне нужно перебирать этот список структур и искать больше структур внутри.
Вот мой код, это может сделать вещи более ясными.
std::list<std::list<iof_chunk>> read_ALLChunks (iof_chunk* reading_material)
{
std::list< std::list<iof_chunk> > ALL_CHUNKS;
std::list< std::list<iof_chunk> >::iterator iter;
if ( ((*reading_material).header.BASEID_Code != 'BODY') && (checkfor_header( &(*reading_material).data[20] )) )
{
ALL_CHUNKS.push_back( read_subChunks(reading_material) );
for( int i = 0; i < ALL_CHUNKS.size; ++i)
{
}
}
}
Мой вопрос о коде выше: Как получить доступ к iof_chunk
в ALL_CHUNKS
Довольно простой способ сделать это с помощью ключевого слова auto
, например:
auto iter = myList.begin();
Это эквивалентно
std::list< std::list<T> >::iterator iter = myList.begin();
Следует помнить, что каждый добавленный вами уровень списка добавляет соответствующий итератор между вами и типом T
Так, например, если у нас есть два списка т.е. std::list<std::list<T>>
нам понадобится два итератора, чтобы получить любые значения T
std::list<std::list<T>> myList;
auto iter1 = myList.begin();
auto iter2 = iter1->begin();
T value = *iter2; //assuming iter2 != iter1->end()
Так что для более сложного примера с более полезным фрагментом кода, поддерживающего его, возьмите следующее:
//list x 4
std::list< std::list< std::list< std::list<T> > > > myCrazyList;
for(auto iter1 = myCrazyList.begin(); iter1 != myCrazyList.end(); ++iter1){
for(auto iter2 = iter1->begin(); iter2 != iter1->end(); ++iter2){
for(auto iter3 = iter2->begin(); iter3 != iter2->end(); ++iter3){
for(auto iter4 = iter3->begin(); iter4 != iter3->end(); ++iter4){
T& value = *iter4;
//do stuff to your T
}
}
}
}
Как вы можете видеть, auto
может способствовать сохранению здравого смысла при работе с такими длинными типами. iter4
будет эквивалентно std::list<T>::iterator
но iter1
с другой стороны, имеет все 4 std::list
в имени типа.
Вы можете использовать итератор таким образом:
std::list< std::list<iof_chunk> > ALL_CHUNKS;
std::list< std::list<iof_chunk> >::iterator i = ALL_CHUNKS.begin();
std::list<iof_chunk> one_chunk;
for(; i != ALL_CHUNKS.end(); ++i) {
*i = one_chunk;
/* it just an example */
}
редактировать
std::list< std::list<iof_chunk> > ALL_CHUNKS;
std::list< std::list<iof_chunk> >::iterator i = ALL_CHUNKS.begin();
for(; i != ALL_CHUNKS.end(); ++i) {
std::list<iof_chunk> i-th_chunkList = *i;
std::list<iof_chunk>::iterator j = *i.begin();
for(; j != *i.end(); ++j) {
/* do your operation with *j that is an iof_chunk object */
}
}
Прежде всего это утверждение неверно, потому что не существует идентификатора, который объявляется.
std::list< std::list<iof_chunk> >::iterator;
Что касается вашего вопроса, тогда вы можете использовать следующую конструкцию
for ( iof_chunk &chunk : ALL_CHUNKS.back() )
{
// do something
}
*i = one_chunk
? Кроме того, почему цикл for повторяет инкремент i, если мы изменим его значение внутри?