コンテンツにスキップ

最終更新:2026-10-12

C++ vector resize と reverse

C++において、resizeとreserveはコンテナ(例えばstd::vector)のサイズとメモリ割り当てを管理するための2つのメンバ関数です。

例えば:

std::vector<int> v1;
v1.resize(1000); //allocation + instance creation
cout <<(v1.size() == 1000)<< endl;   //prints 1
cout <<(v1.capacity()==1000)<< endl; //prints 1

std::vector<int> v2;
v2.reserve(1000); //only allocation
cout <<(v2.size() == 1000)<< endl;   //prints 0
cout <<(v2.capacity()==1000)<< endl; //prints 1

resize関数はコンテナのサイズを変更するために使われ、コンテナ内の要素数を増やしたり減らしたりできます。コンテナのサイズを増やすとき、新しく追加される要素は初期化されます。コンテナのサイズを減らすとき、新しいサイズを超えた分の要素は削除されます。

reserve関数はコンテナのメモリ領域を事前に割り当てるために使われますが、コンテナのサイズは変更しません。頻繁なメモリ再割り当てを避けて性能を向上させるために、十分なメモリを事前に割り当てるのに使えます。ただし、reserveを呼び出してもコンテナのサイズは変わらず、コンテナのために十分なメモリ領域を割り当てるだけです。

なお、resize関数とreserve関数のコンテナ型に対する可用性は異なります。resize関数はほとんどのコンテナ型で使用できますが、reserve関数は動的サイズを持つコンテナ型(例えばstd::vectorやstd::deque)でのみ有効です。固定サイズのコンテナ型(例えばstd::array)に対してreserveを呼び出しても何の効果もありません。

ソースコードのレベルから見ると:

void resize(size_type new_size, value_type value = value_type()) {
    if (new_size < size()) {
        erase(begin() + new_size, end()); // 移除超出新大小的元素
    } else {
        insert(end(), new_size - size(), value); // 添加新元素
    }
}
void reserve(size_type _n) {
    if (__n > max_size())
     __throw_length_error(__N("vector::reserve"));
   if (capacity() < __n)
     _M_reallocate(__n);
}

本節は以上です

関連トピック

コメント