1

だから私はベクトルを持っています。それは最初は空ですが、確かにいっぱいになります。構造のインスタンスが含まれています。

struct some {
    int number;
    MyClass classInstance;
}

/*Meanwhile later in the code:*/
vector<some> my_list;

そうなったとき、ベクトルに値を追加したいのですが、それを1つ大きくする必要があります。しかしもちろん、それを行うための変数を作成したくありません。これが要求されていない場合、私はこれを行います:

//Adding new value:
some new_item;       //Declaring new variable - stupid, ain't it?
my_list.push_back(new_item); //Copying the variable to vector, now I have it twice!

代わりに、new_itemサイズを大きくしてベクトル内に を作成したいと思います - 見てください:

int index = my_list.size();
my_list.reserve(index+1);  //increase the size to current size+1 - that means increase by 1
my_list[index].number = 3;  //If the size was increased, index now contains offset of last item

しかし、これはうまくいきません!スペースが割り当てられていないようです -ベクトル添え字が範囲外エラーになります。

4

3 に答える 3

5
my_list.reserve(index+1); // size() remains the same 

予約は変わりませんmy_list.size()。容量が増えるだけです。あなたはこれを次のものと混同していresizeます:

my_list.resize(index+1);  // increase size by one

vector::resize() と vector::reserve() の選択も参照してください 。

しかし、私は別の方法をお勧めします:

my_vector.push_back(some());

追加のコピーはコンパイラから除外されるため、オーバーヘッドはありません。C++11 を使用している場合は、ベクトルに組み込むことでよりエレガントに行うことができます。

my_vector.emplace_back();
于 2013-03-17T22:15:48.130 に答える
2

std::vector::reserve十分なメモリが割り当てられていることを確認するだけで、のサイズは増加しませんvector。を探していstd::vector::resizeます。

また、C++11 コンパイラを使用している場合は、 を使用std::vector::emplace_backして新しい項目をその場で作成できるため、コピーを回避できます。

my_list.emplace_back(42, ... ); // ... indicates args for MyClass constructor
于 2013-03-17T22:15:58.450 に答える
0

reserve()アロケータにスペースを要求するだけですが、実際にはスペースを埋めません。試すvector.resize()

于 2013-03-17T22:16:44.920 に答える