2017-12-04 10 views
0

C++で2Dベクトルを文字で埋めようとしていますが、このコードを実行すると1行の文字(*..)で終了します。C++で2Dベクトルを塗りつぶします

は、どのように私はこのような2次元ベクトルを埋めることができます。 *.* .**

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<std::vector<char> > vec2D; 
    std::vector<char> rowV; 

    unsigned int row=2; 
    unsigned int col=3; 

    char c; 
    unsigned int temp=0; 

    while(temp!=col) 
    { 
     while(rowV.size()!=row) 
     { 
      std::cin>>c; 
      rowV.push_back(c); 
     } 
     vec2D.push_back(rowV); 
     ++temp; 
    } 

    return 0; 
} 
+0

興味深い無関係なfun-fact: 'std :: vector >'は2Dベクトルを作成しません。これは 'vector'の' vector'を作ります。これはいくつかの厄介なパフォーマンス上の問題(検索用語: "ポインター追跡"、 "空間的局所性")をもたらします。 は、理解して使用するのが残酷に簡単ですが、プロファイリングがプログラムが遅すぎることがわかったら覚えておいてください。 – user4581301

答えて

1

あなたがそうでなければ、それがいっぱいになると、他の文字が追加されません、各挿入後rowVをクリアする必要があります。また、rowcolと入れ替える必要があります。そうしないと、3x2(2x3ではなく)の2Dベクトルが得られます。

while(temp!=row) 
{ 
    while(rowV.size()!=col) 
    { 
     std::cin>>c; 
     rowV.push_back(c); 
    } 
    vec2D.push_back(rowV); 
    rowV.clear(); // clear after inserting 
    ++temp; 
} 
+1

もう一つの選択肢は、 'std :: vector rowV;'の定義をwhile(temp!= row) 'に移動することです。これは少し遅いかもしれませんが(プログラムは 'rowV'を繰り返し構築するかもしれませんが)、' rowV'をより有効にスコープし、読み手が 'rowV'を自分の頭にバインドして、どのように使うのかを助けます。あなたがスピードを優先する良い理由が与えられるまで、読みやすさはスピードを上回るはずです。 – user4581301

+0

@ user4581301はい、どちらの方法も有効です。 –

関連する問題