2010-12-14 60 views
1

我發現自己遍歷載體的載體很多:如何緩解嵌套循環?

std::vector<std::vector<int> > foo; 

for(unsigned int i=0; i != foo.size(); ++i) { 
for(unsigned int j=0; j != foo[i].size(); ++j) { 
    // use foo[i][j] 
} 
} 

我沒有一個很好的小例子,爲什麼「數據」由INT的向量的向量最能代表但我們不懷疑在這裏。

你有什麼建議來簡化循環?我可以想象一個實現顯式循環的函數,併爲該實體提供一個指向函數的指針。

如何在更多層次上「生成」嵌套for循環?

是否有語言對「嵌套循環」有「內置」支持?

在此先感謝,

有人

回答

2

我能想到的功能那 實現明確的循環和 需要一個指向函數的 體。

好像訪問者模式:

http://en.wikipedia.org/wiki/Visitor_pattern

編輯:

我沒有測試模板的一部分,但 是這樣的:

class Visitor 
{ 
    public: 
     template<typename T> 
     void visit(const std::vector<T> &vector) 
     { 
      for(typename std::vector<T>::const_iterator it(vector.begin()); 
       it != vector.end(); 
       ++it) 
      { 
       visit(*it); 
      } 
     } 

     void visit(int i) 
     { 
      // do something with i 
     } 
} 


// usage: 
std::vector<std::vector<int> > theData; 

Visitor v; 
v.visit(theData); 
std::cout << v.result() << std::endl; 
1

有沒有嵌套結構的內置循環(給定嵌套深度可以是任意的)。你有幾個選擇。

將2D矢量展平成單維向量並迭代該向量或使用類似for_each的東西,例如,

template <typename T> 
struct do_foo 
{ 
    void operator()(T v) 
    { 
    // Use the v 
    } 
}; 

template <typename Handler, typename Container> 
struct handle_nested 
{ 
    void operator()(Container const& internal) 
    { 
    // inner loop, container type has been abstracted away and the handler type 
    for_each(internal.begin(), internal.end(), Handler()); 
    } 
}; 

// outer loop 
for_each(foo.begin(), foo.end(), handle_nested<do_foo<int>, std::vector<int> >()); 
1

我認爲嵌套循環,因爲你給我們展示的那個沒有那麼糟糕。 我會建議爲控制變量選擇更好的名稱。如果沒有更好的名字,可以使用outerIndexinnerIndex ?!另外,有時將(複雜)循環體移動到函數中可以提高可讀性。

0

對於向量循環沒有「內置」支持,但是如果做得對,智能編譯器可以優化循環代碼,這可能會利用先進的CPU功能,這可能會提高性能。

一般而言,嵌套循環沒有任何問題。但通常情況下,當您有嵌套循環時,該代碼可能會進行優化以加快運行速度。但是,這很大程度上取決於循環內的代碼,即,您正在嘗試使用向量中的數據。

正如其他人指出的那樣,使用迭代器可以改善您的代碼在遵從C++最佳實踐方面的表現。它不會提高性能,但它會提高類型安全性,並且編譯器可能會向您指出錯誤,即您或編譯器可能沒有注意到的其他錯誤。

如果你在循環內部做的事情非常簡單 - 比方說,如果滿足條件就遞增一個值,那麼標準C++算法(如std::for_each)和謂詞可以用來使代碼更簡潔,可讀。

但不要被這些東西帶走,保持簡單。 ;)