如何在std :: list<中访问单个'type'?的std ::列表<类型> >

时间:2013-11-21 16:44:15

标签: c++ list struct iterator std

我正在创建一个以递归方式在结构中查找结构的函数。 我创建了一个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

3 个答案:

答案 0 :(得分: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's 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 */
  }
}

答案 1 :(得分:0)

首先,此语句无效,因为没有正在声明的标识符。

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

至于你的问题,那么你可以使用以下结构

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

答案 2 :(得分: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