std::vector: 動的配列の標準
C++で最もよく使うコンテナ。サイズ管理不要。
vector
動的配列。サイズ自動拡張。
reserve
メモリを事前確保して再確保を防ぐ。
emplace_back
要素を直接構築してコピーを避ける。
vectorとは?
なぜvectorが必要か?
C言語の配列は固定長で、サイズ変更には手動メモリ管理が必要です。vectorは自動的にサイズを管理し、要素の追加・削除を安全に行えます。現場では、データサイズが事前に分からない場合、vectorがデフォルト選択です。
また、vectorは連続メモリに要素を格納するため、キャッシュ効率が良く、配列と同様の高速アクセスが可能です。
いつ使うか?
- データサイズが事前に分からない場合(ユーザー入力、ファイル読み込みなど)
- 頻繁に要素を追加・削除する場合
- STLアルゴリズム(sort、find、remove)と組み合わせる場合
実践テクニック
サイズ推定:
事前に最大サイズが分かる場合、reserve() でメモリを確保して再確保を防ぐことでパフォーマンスが向上します。
参照渡し:
関数にvectorを渡す際は、コピーを避けるためにconst参照(const std::vector<int>&)で渡すのが基本です。
#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::vectorstd::vector<int> arr(100);// 自動拡張、自動解放、サイズ管理不要パフォーマンスTips
// reserve でメモリ再確保を防ぐstd::vector<int> nums;nums.reserve(1000); // 1000個分のメモリを確保
// emplace_back でコピーを避けるstd::vector<std::string> names;names.emplace_back("Alice"); // 直接構築(コピーなし)
// 範囲ベース forfor (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有りと無しでメモリ再確保の回数を比較してください。