迭代一些 class 的向量列表 (C++)

iterating on a list of vectors of some class (C++)

任何人都可以帮助我解释为什么这段代码在内循环中出现分段错误吗?

我正在尝试迭代一些 class 块的向量列表。

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

This element acts as a placeholder; attempting to access it results in undefined behavior.

如果要反向遍历列表,请使用 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 Seymour 的观点:您使用方式 太多指针。举一个非常明显的例子,几乎没有理由使用指向向量的指针(因为向量本身只不过是指向数据的指针的包装,还有一些额外的数据用于记录有多少数据向量)。

我认为您在 List::end()List::begin() 中遇到了崩溃。这是因为你没有在你的代码中的任何地方初始化你的 List (至少我在你给定的代码中没有看到)。你需要:

class Chain{

    Chain()
    {
        _blockChain = new list<vector<int*>* >;
        // initializing Vector and so on
    }
};

虽然这不是你所有的问题。