2016-04-24 10 views
-2

Iは<vector<char>>

vector<vector<char>> myvec; 

myvec [0] .push_backに5x4マトリックス [ 0000 11110、 11010、 11000、】プッシュしたい(ベクトルに行列を挿入する方法'1')は、ベクトル添え字を範囲外のエラーからスローします。

+1

あなたが唯一の '[]'を使用することができますすでに存在する行の場合 –

+0

「挿入」とはどういう意味ですか? 'myvec'にこの行列5x4を保存するだけでいいですか、それとも行列を保存するために既存のデータを何とかシフトしますか? – Victor

+0

私はちょうどmyvecのマトリックス5x4を保存したい – kotlavaibhav

答えて

0

あなたはベクトルのベクトルを使用していますが、最初に外側のベクトルに新しい "行"を挿入するのを忘れてしまいました。たとえば、あなたがこれを行う可能性があります:

myvec.resize(4); // create 4 rows now 
for (auto& row : myvec) { 
    row.reserve(5); // make space for 5 columns (makes push_back faster). 
} 
myvec[0].push_back('1'); 

を通りさておき、ベクトルのベクトルは、通常、長方形の行列を格納するための次善の選択肢です。それはスペースを無駄にし、行列がまったく矩形のままであることを保証するものではありません(各行は異なる幅になる可能性があります)。しかし、あなたがパフォーマンスについてあまり気にしない、あるいはあなたの行列が小さい場合、それは大きな問題ではないと思います。

+0

'reserve'ループは冗長です –

+2

@ M.M:正確にはどういう意味ですか? –

+1

コードはうまく動作せず、「push_backをより速くする」とは思われません。割り当てが行われたときに変更されているだけですが、まだ割り当てがあります。私の主なポイントは、OPがあなたの答えを読んで、これが必須のステップだと思ったことです。 –

1

空のベクトルを作成し、存在しない要素に[0]でアクセスしようとしました。あなたが行うことができます

ことの一つは、あなたがこのように必要なサイズでベクトルを作成します

// 4 vector elements (rows) each containing a vector of 5 char elements 
std::vector<std::vector<char>> v(4, std::vector<char>(5)); 

次にあなたが要素を追加するpush_back()を使用する必要はありません、彼らはすぐに使用できます:

v[0][0] = '1'; 
v[0][1] = '1'; 
v[0][2] = '1'; 
v[0][3] = '1'; 
v[0][4] = '0'; 


v[1][0] = '1'; 
v[1][1] = '1'; 
v[1][2] = '0'; 
v[1][3] = '1'; 
v[1][4] = '0'; 

// ... etc ... 
0

作成およびワンステップでのベクトルのベクトルを初期化することができます:

std::vector<std::vector<char>> myvec{ 
    {'1','1','1','1','0'}, 
    {'1','1','0','1','0'}, 
    {'1','1','0','0','0'}, 
    {'0','0','0','0','0'} 
    }; 
関連する問題