2010-08-09 61 views
2

基本上我想反過來迭代2個std ::向量。 一個圖層具有形狀向量。反向迭代2個循環?

通常我可以做這樣的事情:

for(int i = 0; i < layers.size(); ++i) 
{ 
    for(int j = 0; j < layers[i].shapes.size(); ++j) 
    { 
     layers[i].shapes[j].dosomething(); 
    } 
} 

但是現在我需要通過向量來扭轉迭代,因此需要使用一個反向迭代,但如何將這項工作?由於迭代器對每個迭代器都有類似的效果,因此如何訪問當前正在迭代的圖層的當前形狀? 感謝

回答

5

最簡單的辦法:

for(int i = layers.size() - 1; i >= 0; --i) 
{ 
    for(int j = layers[i].shapes.size() - 1; j >= 0; --j) 
    { 
     layers[i].shapes[j].dosomething(); 
    } 
} 

的 「正確」 的方式:

for(vector<Layer>::reverse_iterator i = layers.rbegin(); i != layers.rend(); ++i) 
{ 
    for(vector<Shape>::reverse_iterator j = i->shapes.rbegin(); j != i->shapes.rend(); ++j) 
    { 
     j->dosomething(); 
    } 
} 
+0

沒有,性病::向量,這將跳過一個元素 – jmasterx 2010-08-09 15:48:31

+0

@Jex:不,它不會 – sje397 2010-08-09 15:51:49

+0

'rbegin'返回一個'reverse_iterator' – Naveen 2010-08-09 15:57:28

0

如果您使用的是向前迭代指數爲何不反向?即

for(int i = layers.size()-1; i>=0; --i) 
0

你不需要迭代器(反向或以其他方式)。如果你喜歡的代碼,你現在所擁有的,只是希望它的反向運行,你能做到這一點相當直接:

for (int i=layers.size()-1; i>-1; --i) 
    for (int j=layers[i].shapes.size()-1; j>-1; --j) 
     layers[i].shapes[j].dosomething(); 

當然,你可以使用迭代器,如果你喜歡,但在這種情況下,我想它會讓代碼更長,更復雜的整體,而無需添加太多:

std::vector<shape>::reverse_iterator this_shape; 
std::vector<layer>::reverse_iterator this_layer; 

for (this_layer = layers.rbegin(); this_layer != layers.rend(); ++this_layer) 
    for (this_shape = this_layer->shapes.rbegin(); this_shape != this_layer->shapes.rend(); ++this_shape) 
     this_shape->dosomething(); 
0
for(std::vector<mytype>::reverse_iterator i = layers.rbegin(); i != layers.rend(); ++i) 
{ 
    for(std::vector<myothertype>::reverse_iterator j = i->shapes.rbegin(); j != i->shapes.rend(); ++j) 
    { 
     j->dosomething(); 
    } 
} 

迭代器是更靈活的這種方式比指數爲基礎的 - 這是簡單得多的改變開始/ rbegin,結束/ rend和reverse_iterator/iterator,來改變iterat離子方向。如果你經常使用這個代碼,這會變得更加容易,並且只能在某個地方粘貼typedef,如果你有C++ 0x或者可以使用內聯函數進行自動類型推演,那麼這個代碼絕對是最好的。

0

你也可以使用反向迭代器,但它有點冗長。如果你有升壓,但是,它真的很容易,你可以這樣做:

BOOST_REVERSE_FOREACH(std::vector<Shape>& layer, layers) 
{ 
    BOOST_REVERSE_FOREACH(Shape& shape, layer) 
    { 
    shape.dosomething(); 
    } 
} 
0

迭代器容器允許您使用*或訪問「當前」對象 - >運營商 - 在這個意義上迭代器像指向矢量元素的指針。

例如,如果iter是一個迭代上的層的載體,然後可以訪問當前使用迭代指向的層:

layer = *(iter); 

nshapes = iter->shapes.size(); 
1

使用反向迭代器。

typedef std::vector::<Layer>::reverse_iterator LayerIt; 
for(LayerIt layerIt = layers.rbegin(); layerIt != layers.rend(); ++layerIt) // reverse-iterator 
{ 
    Layer& layer = *layerIt; 

    typedef std::vector<Shape>::reverse_iterator ShapeIt; 
    std::vector<Shape>& shapes = layer.shapes; 

    for(ShapeIt shapeIt = shapes.rbegin(); shapeIt != shapes.rend(); ++shapeIt) // reverse-iterator 
    { 
    Shape& shape = *shapeIt; 
    shape.dosomething(); 
    } 
} 

見的std :: vector的rbegin()和雷德()函數:http://www.cplusplus.com/reference/stl/vector/ 我分解代碼,使之更加明顯,告訴我,如果不是這樣的。如果你不知道迭代器,你就必須尋找:)

請注意,如果你使用最新的編譯器與auto的新功能,它更簡單寫:

for(auto layerIt = layers.rbegin(); layerIt != layers.rend(); ++layerIt) // reverse-iterator 
{ 
    Layer& layer = *layerIt; 
    std::vector<Shape>& shapes = layer.shapes; 

    for(auto shapeIt = shapes.rbegin(); shapeIt != shapes.rend(); ++shapeIt) // reverse-iterator 
    { 
    Shape& shape = *shapeIt; 
    shape.dosomething(); 
    } 
} 
+0

這應該是'reverse_iterator'不應該嗎? – sje397 2010-08-09 15:57:20

+0

是的,現在就修好了。 – Klaim 2010-08-09 15:57:35