C++ std::vector完全ガイド:動的配列、イテレータ、実践例
C++ vectorとは
C++ vectorは、要素の追加・削除に合わせて自動的にリサイズされる動的配列です。要素は連続して格納されるため、インデックスによる高速アクセスとイテレータを使った走査が可能です。
末尾への挿入は償却定数時間で行われます。末尾要素の削除も定数時間ですが、先頭や中間への挿入・削除は要素のシフトが必要なため線形時間かかります。
vectorを使うべき場面
- 時間とともに変化する要素のリサイズ可能なコンテナが必要な場合
- 最終的なコレクションサイズがコンパイル時に不明な場合
C++でのvector初期化
std::vector<data-type> name (size, value); // sizeとvalueは省略可能
data-typeが要素型を指定nameがvectorの識別子- オプションの
sizeパラメータで領域を予約;valueで全要素を初期化
イテレータ
イテレータはvector要素へのポインタ風インターフェースを提供します。主なイテレータ関数:
begin()– 最初の要素end()– 末尾の次の要素(past-the-end)cbegin()– 最初の要素への読み取り専用イテレータcend()– 末尾の次の要素への読み取り専用イテレータ
モディファイア(変更操作)
モディファイアはvectorの内容を変更します。主要な関数:
push_back()– 要素を末尾に追加insert()– 指定位置に挿入pop_back()– 末尾要素を削除erase()– 要素範囲を削除clear()– 全要素を削除
例1:基本的なイテレーション
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums;
for (int a = 1; a <= 5; ++a) {
nums.push_back(a);
}
std::cout << "Output from begin and end: ";
for (auto it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << ' ';
}
std::cout << "\nOutput from cbegin and cend: ";
for (auto it = nums.cbegin(); it != nums.cend(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
出力:
例2:高度なモディファイア
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums;
nums.assign(5, 1); // 5要素、すべて1で初期化
std::cout << "Vector contents: ";
for (size_t i = 0; i < nums.size(); ++i) {
std::cout << nums[i] << ' ';
}
nums.push_back(2);
std::cout << "\nLast element: " << nums.back();
nums.pop_back();
std::cout << "\nVector contents: ";
for (int a : nums) std::cout << a << ' ';
nums.insert(nums.begin(), 7);
std::cout << "\nFirst element: " << nums.front();
nums.clear();
std::cout << "\nSize after clear(): " << nums.size();
return 0;
}
出力:
容量関連関数
vectorのストレージ特性を確認・操作する関数:
size()– 現在の要素数max_size()– 理論上の最大要素数capacity()– 割り当て済みストレージ容量resize(n)– 要素数をnに変更、必要に応じて追加・削除empty()– 要素がなければtrue
例3:容量の探索
#include <iostream>
#include <vector>
int main() {
std::vector<int> vector1;
for (int x = 1; x <= 10; ++x) {
vector1.push_back(x);
}
std::cout << "Vector size: " << vector1.size() << std::endl;
std::cout << "Vector capacity: " << vector1.capacity() << std::endl;
std::cout << "Maximum size of vector: " << vector1.max_size() << std::endl;
vector1.resize(5);
std::cout << "Vector size after resizing: " << vector1.size() << std::endl;
if (!vector1.empty())
std::cout << "Vector is not empty" << std::endl;
else
std::cout << "Vector is empty" << std::endl;
return 0;
}
出力:
重要なポイント
- C++ vectorは高効率で自動リサイズ可能なコンテナ
- 要素は連続メモリに配置され、高速ランダムアクセスを提供
- 末尾への挿入・削除は償却定数時間;先頭・中間は線形時間
- データサイズが予測不能または変動するシナリオに最適
C言語