Как получить доступ к отдельному типу внутри std :: list <std :: list <type>>

0

Я создаю функцию, которая рекурсивно находит структуры внутри структур. Я создаю 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

Теги:
list
struct
iterator
std

3 ответа

0
Лучший ответ

Довольно простой способ сделать это с помощью ключевого слова 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 в имени типа.

1

Вы можете использовать итератор таким образом:

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 */
  }
}
  • 0
    что делает *i = one_chunk ? Кроме того, почему цикл for повторяет инкремент i, если мы изменим его значение внутри?
  • 0
    * i = one_chunk, это всего лишь пример, объясняющий, как вы можете получить доступ к объекту, «указанному» итератором. «i» - итератор, «* i» - указатель объекта итератором. В этом случае «i» является итератором объекта списка <iof_chunk>, поэтому «* i» будет единственным списком iof_chunk. Смотрите редактировать.
0

Прежде всего это утверждение неверно, потому что не существует идентификатора, который объявляется.

std::list< std::list<iof_chunk> >::iterator;

Что касается вашего вопроса, тогда вы можете использовать следующую конструкцию

for ( iof_chunk &chunk : ALL_CHUNKS.back() )
{
   // do something
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню