2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

std::vector::reserveは何のために行うのか?

Posted at

概要

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すること。
(とくに大きなデータを扱う場合。)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?