[英]iterating on a list of vectors of some class (C++)
谁能为我提供帮助,为什么这段代码会给我内部循环的分段错误?
我正在尝试迭代某些类块的向量列表。
class chain
{
list<vector<Block*>* >* _blockChain;
}
Chain* someChain = new Chain();
for(list<vector<Block*>*>::iterator listIter = someChain->getChain()->end() ;
listIter != someChain->getChain()->begin(); listIter--)
{
for(vector<Block*>::iterator it = (*listIter)->begin();
it != (*listIter)->end() ; it++)
{
//do something
}
}
首次尝试访问listIter
它指向不被取消引用的end()
。 在内部循环中,您取消引用listIter
并尝试使用它。
来自http://en.cppreference.com/w/cpp/container/vector/end
此元素充当占位符; 尝试访问它会导致未定义的行为。
如果要反向遍历列表,请使用reverse_iterator:
for(list<vector<Block*>*>::reverse_iterator listIter = someChain->getChain()->rbegin();
listIter != someChain->getChain()->rend(); ++listIter)
使用最新的编译器,您可以将其压缩一些:
for (auto listIter = someChain->getChain()->rbegin();
listIter != someChain->getChain()->rend(); ++listIter)
这就是说,我同意@Mike西摩:您正在使用太多的指针。 举一个非常明显的例子,几乎没有理由使用指向向量的指针(因为向量本身仅是指向数据的指针的包装器,还有一些额外的数据用于簿记关于其中有多少数据向量)。
我认为您在List::end()
和List::begin()
遇到崩溃。 这是因为您尚未在代码中的任何地方初始化List
(至少在给定的代码中我没有看到)。 你需要:
class Chain{
Chain()
{
_blockChain = new list<vector<int*>* >;
// initializing Vector and so on
}
};
尽管这不是您的所有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.