概要
c++のboostライブラリ内で、vectorのpush_back前にreserveしている箇所があった。
vectorって動的配列だからあらかじめ要素を確保しておく必要はないんじゃないか? と思ったので調べてみた。
目次
- std::vector::reserveとは
- 勘違い
- あらかじめcapacityを確保する意味は?
- まとめ
std::vector::reserveとは
constexpr void reserve(size_type n);
vectorのcapacityを引数nに変更する。
勘違い
「capacity」=「size」ではない。
size = 要素数。
capacity = 割り当てられている容量。
◆確認用コード
#include <iostream>
#include <vector>
#include <chrono>
int main()
{
std::vector<int> v;
std::cout << "reserve()前のサイズ:" << v.size() << std::endl;
std::cout << "reserve()前の容量:" << v.capacity() << std::endl;
v.reserve(5);
std::cout << "reserve()後のサイズ:" << v.size() << std::endl;
std::cout << "reserve()後の容量:" << v.capacity() << std::endl;
v.push_back(1);
std::cout << "push_back()後のサイズ:" << v.size() << std::endl;
std::cout << "push_back()後の容量:" << v.capacity() << std::endl;
}
◆実行結果
reserve()前のサイズ:0
reserve()前の容量:0
reserve()後のサイズ:0
reserve()後の容量:5
push_back()後のサイズ:1
push_back()後の容量:5
あらかじめcapacityを確保する意味は?
reserveしない場合、push_backごとにメモリを確保しなくてはいけないため、その分処理速度に影響する。
実際にどれくらいの差が出るかについては、以下のページが参考となる。
【C++】std::vectorにおける要素追加の速度比較(push_back, reserve, resize)
まとめ
あらかじめstd::vector::reserveでcapacityを確保するとしないとでは、要素追加時の処理速度に差が出る。
要素数にある程度の目星がついている場合はreserveしてからpush_backすること。
(とくに大きなデータを扱う場合。)