2010-12-14 3 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-loopsを "生成する"方法はありますか?

"ネストループ"の "組み込み"サポートを持つ言語はありますか?事前に

おかげで、

誰か

答えて

1

私は何を探していることはイテレータパターンだと思います。

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

+1

これはウィキペディアの "iterator pattern"ページへのリンクです:http://en.wikipedia.org/wiki/Iterator_pattern – AudioDroid

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

ありネストされた構造の組み込みループはありません(ネスティングの深さは任意です)。いくつかの選択肢があります。

2次元ベクトルを1次元のベクトルに変換し、それを繰り返し処理します。たとえば、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

ベクタルーピングのための「ビルトイン」サポートはありませんが、正しく実行された場合、スマートコンパイラはforループをコードに最適化し、高度なCPU機能を利用する可能性があります。

一般に、入れ子になったループには何も問題はありません。しかし、しばしばネストされたループがあるとき、そのコードはより速く実行するように最適化されるかもしれません。しかし、これはループ内のコード、つまりベクトル内のデータを使ってやっていることに大きく依存します。

他の人に指摘されているように、イテレータを使用すると、C++のベストプラクティスに準拠してコードが改善されます。パフォーマンスを向上させることはできませんが、型の安全性が向上し、コンパイラはあなたや他のコンパイラが気付いていない間違いを指摘することができます。

ループ内で行うことが非常に簡単な場合、たとえば条件を満たす場合は値を増やし、std::for_eachなどの標準C++アルゴリズムを使用して、コードをより簡潔にすることができます。読める。

しかし、これらのことに惑わされないでください。簡単にしてください。 ;)

関連する問題