2016-07-14 6 views
-1

異なるサイズのn個のベクトルを含むセットがあるとします。 範囲指定のループを使用せずに反復処理を行いたいと思います。 どうすればいいですか!例えば
//これは動作しますが、私は 範囲ベースのループやベクトルへの参照を使用せずにベクトルを含むセットを反復する

set < vector <int> > fset; 
    for(auto it : fset) 
     { 
      for(auto itt : it) 
      cout << itt << " "; 
      cout << endl; 
     } 


ここに範囲ベースのループを使用していた//これあまりにも動作しますが、私は賢明

set < vector <int> > fset; 
for(set < vector <int> > :: iterator it=fset.begin();it!=fset.end();++it) 
    { 
     const vector <int>& i = (*it); 
     int l = i.size(); 
     for(int j=0; j<l; ++j) 
     cout << i[j] << " "; 
     cout << endl; 
    } 
ベクトルの参照と反復指標としてAIを使用していました


すべてのベクターの内容をセットごとに1行ずつ表示したいのですが上記の方法のいずれかを使用してください。 どうすればいいですか? ありがとうございます!

+2

これはあなたの宿題でしょうか? –

+1

あなたは、セットのイテレーターを使用しました。 –

+0

私はcppでstlを学ぶのが初めてで、それを試しましたが、エラーが発生しています! @Gill Bates –

答えて

0

が必要、これはベクトルのあなたのセットを印刷する必要があります:

set <vector <int> > data; 

for (const auto& row : data) 
{ 
    for (int value : row) 
    cout << value << ", "; 
    cout << "\n"; 
} 

することができます内部ループ内のベクトルの要素と内部ループの前後にある行の先頭または末尾にあるものの間の書式を簡単に調整できます。

使用イテレータ:

for (auto row_it = data.begin(); row_it != data.end(); ++row_it) 
{ 
    for (auto value_it = row_it->begin(); value_it != row_it->end(); ++value_it) 
    cout << *value_it << ", "; 
    cout << "\n"; 
} 

これら二つのことは、まったく同じことを行います。 ranged-forは、内部ループの始めに、

int value = *value_it; 

のようなものを追加することによって間接レベルを追加します。

これが役に立ちます。

(おっと。固定タイプミス。)


最終編集
私はあなたが基本的にある古いC++コンパイラ(C++ 98やC++ 03、で立ち往生している推測しています同じもの)autoを避けたい場合。

イテレータの名前を正しく指定するには、そのイテレータが表すタイプについて考える必要があります。ここではっきりしないものは、コードを見るだけで、の値を変更することはできません。したがって、すべての内部イテレータはconstでなければなりません。

しかし、あなたはセットそのものを印刷しているだけなので、外側のループにもconstイテレータを明示的に使用することができます。

for (set <vector <int> > ::const_iterator row_it = data.begin(); row_it != data.end(); ++row_it) 
{ 
    for (vector <int> ::const_iterator value_it = row_it->begin(); value_it != row_it->end(); ++value_it) 
    cout << *value_it << ", "; 
    cout << "\n"; 
} 

希望します。

+0

「あなたは遠隔ベースのループを使わずに反復したいと思っています。 –

+1

私は、セットとベクトルのイテレータを使い、それらのすべてを表示したいと思います。私はベクトルを反復しようとしましたが、ImはオンラインIDEでコンパイルエラーを受け取りました。 実際には、遠隔基盤のループを使用するのは簡単ですが、イテレータを使用しないと、イテレータの動作を知る必要があります。 @GillBates –

+1

あなたは実際の問題解決について何を理解しませんでしたか?私はOPが彼らの問題を解決するのを助けようと努力しているのではなく、彼らの質問に最もリテラルな可能性のある回答で答えるだけです。 OPは明らかにそのセットを印刷したいと思っており、それをするのに苦労しています。 –

1

私が理解から、C++ 14(が、同様にC++ 11にも容易に転換可能)

#include <iostream> 
#include <ostream> 
#include <iterator> 
#include <set> 
#include <vector> 

int main() { 
    std::set<std::vector<int>> svec = { 
    {1,2,3}, 
    {4,5,6} 
    }; 
    std::for_each(std::begin(svec), std::end(svec), 
       [](const auto& vec) { 
        std::copy(std::begin(vec), std::end(vec), 
          std::ostream_iterator<int>(std::cout, " ")); 
        std::cout << '\n'; 
       }); 
    return 0; 
} 
関連する問題