簡體   English   中英

C ++:遍歷向量的向量

[英]C++: Iterating through a vector of vectors

嘿! 我正在做這個項目,現在我正在嘗試:

  1. 創建一些對象並將其存儲在矢量中,這些矢量將存儲在另一個矢量V中
  2. 遍歷V內部的向量
  3. 遍歷各個向量內的對象

無論如何,我只是在網上搜索,遇到了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM