2012-03-01 15 views
3

'row'または1Dベクトルの値を定義し、その行を2Dベクトルにpushしようとしています。私はエラーをスローしないで、動作するようにも見えないいくつかの異なるものを試しました。以下のコード:Push_back 1次元ベクトルを2次元ベクトル配列に

#include <vector> 
#include <iostream> 
using std::vector; 

#define HEIGHT 5 
#define WIDTH 3 

// 2D VECTOR ARRAY EXAMPLE 

int main() { 
vector<vector<double> > array2D; 
vector<double> currentRow; 

// Set up sizes. (HEIGHT x WIDTH) 
// 2D resize 
array2D.resize(HEIGHT); 
for (int i = 0; i < HEIGHT; ++i) 
{ 
    array2D[i].resize(WIDTH); 
} 
// Try putting some values in 
array2D[1][2] = 6.0; // this works 
array2D[2].push_back(45); // this value doesn't appear in vector output. Why? 

// 1D resize 
currentRow.resize(3); 

// Insert values into row 
currentRow[0] = 1; 
currentRow[1] = 12.76; 
currentRow[2] = 3; 

// Push row into 2D array 
array2D.push_back(currentRow); // this row doesn't appear in value output. Why? 

// Output all values 
for (int i = 0; i < HEIGHT; ++i) 
{ 
    for (int j = 0; j < WIDTH; ++j) 
    { 
     std::cout << array2D[i][j] << '\t'; 
    } 
    std::cout << std::endl; 
} 
return 0; 
} 

答えて

7

currentRowをpush_backするとき、array2DにHEIGHT行が既に含まれています。また、push_backの後にHEIGHT + 1行が格納されます。最後に追加したものは表示せず、最初のHEIGHT行のみを表示します。

+0

明らかに私はあなたにアップアップをするほどの評判はない。しかし、ありがとう! – ProGirlXOXO

1

あなたが実際に代わりreserveメソッドを使用したいときは、resizeを使用しています。つまり、リサイズはベクトルの内容を変更しますが、リザーブは記憶容量を変更するだけです。したがって、ベクトルをN個の要素にリサイズし、いくつかの要素をその中に押し込むと、それらはN、N + 1などの位置にプッシュされますが、N個の要素のサイズを予約するだけで、位置0,1にプッシュされますあなたが望むようなものです。

3

push_back()は、ベクターの最後に項目を追加します。ベクターにWIDTHのアイテムが含まれている場合は、push_back()の後にWIDTH+1個のアイテムが含まれています。

ベクトルの内容を印刷すると、最初にWIDTHの項目が印刷されます。これは、ベクトルにmoreが含まれていても表示されるため、追加の項目は表示されません。

size()メソッドを使用すると、ベクターに含まれるアイテムの数がわかります。