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