C++ コンテナクラス<vector>
概要
C++ 標準ライブラリ(Standard Template Library、STL)は C++ の重要な構成要素であり、データ集合を処理するための汎用テンプレートクラスと関数群を提供します。<vector>STL内のコンテナクラスの一つであり、動的サイズの配列を格納するために使用されます。
<vector>はシーケンスコンテナであり、ユーザーがコンテナの末尾に要素をすばやく追加または削除することを可能にします。配列と比較して、<vector>自動サイズ調整やランダムアクセスなど、より多くの機能を提供します。
構文
C++ では、<vector>ヘッダーファイルのインクルードが必要です<<vector>>。以下は基本的な構文です:
-
を宣言する
vector:std::vector<int> myVector;
-
要素の追加:
myVector.push_back(10);
-
要素へのアクセス:
int firstElement = myVector[0];
-
要素数の取得:
size_t size = myVector.size();
-
クリア
vector:myVector.clear();
宣言と初期化
<vector>要素の型を指定する必要があり、複数の方法で初期化できます:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1; // 空的vector
std::vector<int> vec2(5); // 长度为5的vector,元素默认初始化
std::vector<int> vec3(5, 10); // 长度为5的vector,元素值为10
std::vector<int> vec4 = {1, 2, 3, 4}; // 使用初始化列表初始化
return 0;
}
例
以下は<vector>を使用した簡単な例で、出力結果を含みます。
例
#include <iostream>
#include <vector>
int main() {
// 整数を格納する vector を宣言
std::vector<int> numbers;
// 要素を追加
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// vector の要素を出力
std::cout << "Vector contains: ";
for (int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// さらに要素を追加
numbers.push_back(40);
numbers.push_back(50);
// vector の要素を再度出力
std::cout << "After adding more elements, vector contains: ";
for (int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// 特定の要素にアクセス
std::cout << "The first element is: " << numbers[0] << std::endl;
// vector をクリア
numbers.clear();
// vector が空かどうかを確認
if (numbers.empty()) {
std::cout << "The vector is now empty." << std::endl;
}
return 0;
}
#include <vector>
int main() {
// 整数を格納する vector を宣言
std::vector<int> numbers;
// 要素を追加
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// vector の要素を出力
std::cout << "Vector contains: ";
for (int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// さらに要素を追加
numbers.push_back(40);
numbers.push_back(50);
// vector の要素を再度出力
std::cout << "After adding more elements, vector contains: ";
for (int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// 特定の要素にアクセス
std::cout << "The first element is: " << numbers[0] << std::endl;
// vector をクリア
numbers.clear();
// vector が空かどうかを確認
if (numbers.empty()) {
std::cout << "The vector is now empty." << std::endl;
}
return 0;
}
出力結果:
Vector contains: 10 20 30 After adding more elements, vector contains: 10 20 30 40 50 The first element is: 10 The vector is now empty.
一般的なメンバ関数
以下は<vector>の一般的なメンバ関数の一部です:
| 関数 | 説明 |
|---|---|
push_back(const T& val) |
末尾に要素を追加 |
pop_back() |
末尾の要素を削除 |
at(size_t pos) |
指定位置の要素を返す(境界チェック付き) |
operator[] |
指定位置の要素を返す(境界チェックなし) |
front() |
最初の要素を返す |
back() |
最後の要素を返す |
data() |
内部の配列を指すポインタを返す |
size() |
現在の要素数を返す |
capacity() |
現在割り当てられている容量を返す |
reserve(size_t n) |
少なくともn個分の要素の記憶域を確保 |
resize(size_t n) |
要素数を調整するn |
clear() |
すべての要素をクリア |
insert(iterator pos, val) |
指定位置に要素を挿入 |
erase(iterator pos) |
指定位置の要素を削除 |
begin() / end() |
先頭/末尾のイテレータを返す |
例
1、基本操作
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// すべての要素を出力
std::cout << "Vector elements: ";
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
// 最初と最後の要素を取得
std::cout << "First element: " << vec.front() << std::endl;
std::cout << "Last element: " << vec.back() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// すべての要素を出力
std::cout << "Vector elements: ";
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << " ";
}
std::cout << std::endl;
// 最初と最後の要素を取得
std::cout << "First element: " << vec.front() << std::endl;
std::cout << "Last element: " << vec.back() << std::endl;
return 0;
}
2、動的な要素の追加と削除
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
std::cout << "Vector size: " << vec.size() << std::endl;
std::cout << "Vector capacity: " << vec.capacity() << std::endl;
// 最後の要素を削除
vec.pop_back();
std::cout << "After pop_back, size: " << vec.size() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
std::cout << "Vector size: " << vec.size() << std::endl;
std::cout << "Vector capacity: " << vec.capacity() << std::endl;
// 最後の要素を削除
vec.pop_back();
std::cout << "After pop_back, size: " << vec.size() << std::endl;
return 0;
}
3、境界チェックと安全なアクセス
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
try {
std::cout << vec.at(2) << std::endl; // 正常に出力
std::cout << vec.at(5) << std::endl; // 範囲外のため、例外をスロー
} catch (const std::out_of_range& e) {
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
try {
std::cout << vec.at(2) << std::endl; // 正常に出力
std::cout << vec.at(5) << std::endl; // 範囲外のため、例外をスロー
} catch (const std::out_of_range& e) {
std::cout << "Exception: " << e.what() << std::endl;
}
return 0;
}
4、容量の事前割り当て
例
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec;
vec.reserve(10); // 容量を事前に確保し、頻繁なメモリ割り当てを回避
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
std::cout << "Capacity after push_back(" << i << "): " << vec.capacity() << std::endl;
}
return 0;
}
#include <vector>
int main() {
std::vector<int> vec;
vec.reserve(10); // 容量を事前に確保し、頻繁なメモリ割り当てを回避
for (int i = 0; i < 10; ++i) {
vec.push_back(i);
std::cout << "Capacity after push_back(" << i << "): " << vec.capacity() << std::endl;
}
return 0;
}
他のコンテナとの比較
| 特性 | std::vector | std::array | std::list |
|---|---|---|---|
| サイズ | 動的に変更可能 | コンパイル時に固定 | 動的に変更可能 |
| 格納場所 | 連続メモリ | 連続メモリ | 非連続メモリ |
| アクセス性能 | ランダムアクセスが高速 | ランダムアクセスが高速 | ランダムアクセスは遅く、順次アクセスに適している |
| 挿入と削除の性能 | 末尾操作は高性能、他の位置では遅い | サポートしない | 任意の位置での挿入と削除が比較的速い |
| メモリ増加の仕組み | 容量不足時には倍々に増加 | 无 | 无 |
<vector>C++ STLの中でも非常に便利なコンテナであり、動的配列の機能を提供するため、要素の追加と削除がより柔軟で便利になります。上記の例を通じて、初心者は<vector>の基本的な使い方と操作をすばやく理解できます。学習を深めるにつれて、<vector>実際のプログラミングにおける強力な機能と幅広い応用を発見できるでしょう。