std::vector: 動的配列の標準

C++で最もよく使うコンテナ。サイズ管理不要。

vector
動的配列。サイズ自動拡張。
reserve
メモリを事前確保して再確保を防ぐ。
emplace_back
要素を直接構築してコピーを避ける。

vectorとは?

伸びるゴムバンド

中身が増えると自動で伸びる。普通の配列は固定長の箱。

なぜvectorが必要か?

C言語の配列は固定長で、サイズ変更には手動メモリ管理が必要です。vectorは自動的にサイズを管理し、要素の追加・削除を安全に行えます。現場では、データサイズが事前に分からない場合、vectorがデフォルト選択です。

また、vectorは連続メモリに要素を格納するため、キャッシュ効率が良く、配列と同様の高速アクセスが可能です。

いつ使うか?

  • データサイズが事前に分からない場合(ユーザー入力、ファイル読み込みなど)
  • 頻繁に要素を追加・削除する場合
  • STLアルゴリズム(sort、find、remove)と組み合わせる場合

実践テクニック

サイズ推定: 事前に最大サイズが分かる場合、reserve() でメモリを確保して再確保を防ぐことでパフォーマンスが向上します。
参照渡し: 関数にvectorを渡す際は、コピーを避けるためにconst参照(const std::vector<int>&)で渡すのが基本です。
Basic Operations
#include <vector>
std::vector<int> nums = {1, 2, 3, 4, 5};
nums.push_back(6); // 末尾に追加
nums.pop_back(); // 末尾を削除
nums[0] = 10; // アクセス
nums.at(0); // 境界チェック付きアクセス
nums.size(); // 要素数
nums.empty(); // 空かどうか
実行結果
nums[0] = 10\nsize = 5
Bad
// ❌ Bad: 生の配列
int* arr = new int[100];
// サイズ管理が手動、拡張不可
delete[] arr; // 忘れるとリーク
Good
// ✅ Good: std::vector
std::vector<int> arr(100);
// 自動拡張、自動解放、サイズ管理不要

パフォーマンスTips

Optimization
// reserve でメモリ再確保を防ぐ
std::vector<int> nums;
nums.reserve(1000); // 1000個分のメモリを確保
// emplace_back でコピーを避ける
std::vector<std::string> names;
names.emplace_back("Alice"); // 直接構築(コピーなし)
// 範囲ベース for
for (const auto& n : nums) {
std::cout << n << '\n';
}

合格ライン

push_back と emplace_back の違いを知っている
reserve の役割を説明できる

参考リンク

演習課題

課題1: vectorの基本操作
int型のvectorを作成し、push_back で要素を追加、rangeベースforで表示してください。
課題2: reserve
1000要素のvectorを作成する際、reserve有りと無しでメモリ再確保の回数を比較してください。

次のステップ