2015-05-18 26 views
0

任何人都可以幫我解釋爲什麼這段代碼給我一個內部循環的分段錯誤?

我想迭代一些類塊的向量列表。在某些類的向量列表上迭代(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 
    } 
} 
+1

可能是因爲您使用的指針太多了。如果你想要一個特定的答案,你需要[演示問題](http://stackoverflow.com/help/mcve)。 –

回答

1

如果你想在列表中反向迭代,使用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:你用的方式指針太多了。對於一個非常明顯的例子,幾乎沒有理由使用指向矢量的指針(因爲矢量本身不僅僅是指向數據的指針的包裝,還有一些額外的數據用於記錄數據的數量矢量)。

1

您嘗試訪問listIter它指向end()這是不被取消引用的第一次。在內部循環中,您取消引用listIter並嘗試使用它。

http://en.cppreference.com/w/cpp/container/vector/end

該元素充當佔位符;試圖訪問它會導致未定義的行爲。

+0

謝謝,我可以問你,我怎樣才能迭代從頭到尾的列表? –

+0

@MiddleMan見Jerry Coffin的回答 – NathanOliver

0

我想你在List::end()List::begin()面臨崩潰。這是因爲你沒有在代碼中的任何地方初始化List(至少我沒有看到你的代碼)。你需要:

class Chain{ 

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

雖然這不是你所有的問題。