[英]C++: Iterating through a vector of vectors
嘿! 我正在做這個項目,現在我正在嘗試:
無論如何,我只是在網上搜索,遇到了stl for_each函數。 看起來很整潔,但是我遇到了問題。 我正在嘗試以這種方式使用它:
for_each(V.begin(), V.end(), iterateThroughSmallVectors);
iterateThroug ....只需對傳遞給它的向量做同樣的事情。
現在,我收到一個奇怪的“向量迭代器不兼容”運行時錯誤。 我已經看過了,在此上找不到任何有用的輸入。
我不知道它是否有幫助,但是V是存儲在類A中的私有vector <>,它具有對其的訪問器,並且我正在嘗試通過執行以下操作在類B中進行迭代:
A->getV().begin(), A->getV().end(), etc..
任何人都知道發生了什么事嗎?
編輯:好的,所以我認為最好只是發布代碼,並且可能會出現問題...
gameState.h中的getTiles:
vector<vector<tile*>> getTiles();
main.cpp中的for_each循環:
for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);
.
.
void drawTiles(vector<tile*> row)
{
for_each(row.begin(), row.end(), dTile);
}
void dTile(tile *t)
{
t->draw();
}
創建向量:
int tp = -1;
int bCounter = 0;
int wCounter = 0;
for (int i = 0; i < 8; i++)
{
vector<tile*> row(8);
for (int j = 0; j < 8; j++)
{
tile *t = new tile(tp, (i+(SIDELENGTH/2))*SIDELENGTH,
(j+(SIDELENGTH/2))*SIDELENGTH);
row.push_back(t);
tp *= -1;
}
currState->setTiles(row);
tp *= -1;
}
以防萬一它可能是相關的:
void gameState::setTiles(vector<tile*> val)
{
tiles.push_back(val);
}
現在更容易發現問題了嗎? 我希望如此...如果您發現我可能正在做的任何愚蠢的事情,請告訴我,我對C ++還是陌生的,指針和引用仍然使我感到困惑。
EDIT2:謝謝大家,效果很好...對於該問題來說很好,現在看來我在創建磁貼並將它們填充到行向量中時遇到了問題。似乎即使通過向量也可以正確創建並傳遞,原本應該放在其中的圖塊則不會(它們在:之后丟失了:
for (int j = 0; j < 8; j++)
{
tile *t = new tile(tp, (i+(SIDELENGTH/2))*SIDELENGTH,
(j+(SIDELENGTH/2))*SIDELENGTH);
row.push_back(t);
tp *= -1;
}
環。 如果您有任何解決此問題的好主意,歡迎您為我提供幫助;)同時,我將繼續嘗試解決問題
A::getV()
的原型是什么?
我只是猜測,但是如果A::getV()
沒有返回引用,那么它可以解釋“向量迭代器不兼容”的錯誤消息。
實際上, A->getV().begin()
和A->getV().end()
將是兩個在不同向量上進行迭代的迭代器:每次A->getV()
調用均返回私有成員的不同副本。
希望這可以幫助您調試問題。
編輯:看起來像我預料的那樣:編輯完提供詳細信息的問題后,我可以看到您正在定義
vector<vector<tile*> > getTiles();
因此,在以下語句中:
for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);
如上所述,每次對getTiles()
調用都將返回成員向量的單獨臨時副本。 結果,從begin()
和end()
返回的迭代器來自不同的向量,因此在運行時會遇到錯誤消息。
而且,正如Charles在其詳細答案中指出的那樣,這些臨時向量將在到達for_each
的函數體時被銷毀。
考慮像這樣通過const引用返回向量:
const vector<vector<tile*> >& getTiles() const;
您也可以更改drawTiles
以避免更多副本:
void drawTiles(const vector<tile*>& row)
我要做的是:直接方式
vector<vector<int> > vvi;
vector<vector<int> >::iterator vvi_iterator;
vector<int>::iterator vi_iterator;
for(vvi_terator = vvi.begin();vvi_iterator!=vvi.end();++vvi_iterator) {
for(vi_iterator = (*vvi_iterator).begin();vi_iterator!=(*vvi_iterator).end();++vi _iterator) {
cout<<*vi_iterator<<" ";
}
}
這是一個粗略的想法。 我發現for_each方法僅執行雙循環比較麻煩。 當您想對每個元素進行某些計算時(例如,每個元素進行某種映射),for_each很有用
您有幾個嚴重的錯誤,但首先是一個小錯誤。
vector<vector<tile*>> getTiles();
在下一個標准出爐之前,您需要在to >
之間留一個空格。
vector< vector<tile*> > getTiles();
此函數按值返回vector
,這意味着它將創建傳遞給函數中return語句的vector
的新副本。 (我假定此函數聲明是curState
是其實例的任何類。)
當您這樣做時:
for_each(currState->getTiles().begin(),currState->getTiles().end(), drawTiles);
每次對getTiles的調用都將返回向量的單獨的臨時副本。 這不僅意味着begin()
和end()
迭代器來自差異向量,而且在到達for_each
的函數體時這些向量將被銷毀。
看來您需要研究引用並逐個引用,因為在這些情況下您需要正確理解std::for_each
之前,需要了解這些內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.