2012-01-27 10 views
1

正しい用語がわからないため、重複の可能性を探すのに問題がありました。複数のベクトルをループする

すでに作成されているベクターが多い場合は、どのようにループすることができますか?物事を簡単にするために、"vec_one""vec_two""vec_three"という3つの文字列ベクトルがあるとします。私はのような何かをしたい

for i in ("vec_one", "vec_two", "vec_three") { 
    for (vector<string>::const_iterator iter = i.begin(); iter != i.end(); ++iter) { 
     //do something with the elements ***and I need to access "i"***, that is, the vector name. 
    } 
} 

これは、ループの異なる3つの書き込みと同じになりますが、読みやすく、実際に私は私の非単純なアプリケーションにおける3以上のものを持っているでしょう。

ベクトル名にアクセスする必要があるため(注釈を参照)、すべてをまとめて1つのループを実行できないことに注意してください。

+0

'vec_o​​ne'、' vec_two'などへのポインタ(または参照)の配列を作る...外部ループはこれらのポインタの配列を通り、外部ループのインデックスによって内部ループにアクセスします。 – lapk

+0

@AzzA参照の配列を作ることはできません。 –

+0

@SethCarnegieあなたは間違いないです。 – lapk

答えて

1

あなたはvector<std::pair<std::string, std::vector<...>*>内のベクトル置くことができる:あなたが外イテレータから簡単に名を取得することができます

std::vector<std::pair<std::string, std::vector<std::string>*> > vectors; 
vectors.emplace_back(std::string("vec_one"), &vec_one); //or push_back(std::make_pair(...)) in C++03 
vectors.emplace_back(std::string("vec_two"), &vec_two); 
vectors.emplace_back(std::string("vec_three"), &vec_three); 
for(auto iter = vectors.begin(); iter != vectors.end(); ++iter)//used c++11 auto here for brevity, but that isn't necessary if C++11 is not availible 
    for(auto vecIter = iter->second->begin(); vecIter != iter->second->end(); ++vecIter) 
    //get name with iter->first, body here 

その方法を。

あなたがC++ 11を使用している場合は、代わりにstd::arrayを使用することができます:C++ 03では

std::array<std::pair<std::string, std::vector<std::string>*>, 3> vectors = 
{ 
    std::make_pair(std::string("vec_one"), &vec_one), 
    std::make_pair(std::string("vec_two"), &vec_two), 
    std::make_pair(std::string("vec_three"), &vec_three) 
}; 

を(あなたの代わりにbuildinアレイを使用することができますが、vectorのための余分なオーバーヘッドがあなたのための問題でない限り、 )私はそうする魅力的な理由は見当たりません。 boost::arrayも、C++を使用できない場合には注目に値するでしょう。

絶対最適なパフォーマンスが必要な場合は、std::stringの代わりにconst char*を直接使用する価値があります。

+0

ありがとう、グリズリー。私はあなたが許すさまざまなオプションを特に感謝します。残念ながら、私はC++ 03を使用する必要があります。 –

+0

誰でもこの答えをdownvoted:私はこの答えで何が間違って表示されないので、downvoteの説明がいいだろう。 – Grizzly

6

あなたは、配列でそれを行うことができます:おそらく最も簡単な方法は、(それらの変数の数がある場合、またはベクトルのベクトル)の配列であなたのベクトルを持っているだろう

const vector<string>* varr[] = { &vec_one, &vec_two, &vec_three, &etc }; 

for (auto vec = begin(varr); vec < end(varr); ++vec) 
    for (vector<string>::const_iterator iter = begin(**vec); iter != end(**vec); ++iter) 
     //do something with the elements 
+0

ありがとう、セス。これはそれを行う最も自然な方法のようです。 –

0

私はあなたの2番目の条件を満たすための "ベクトル名"の配列が必要だろうと思います。

関連する問題