[C++] vectorの初期化方法とその活用法
C++でのvector
の初期化方法にはいくつかの方法があります。
デフォルトコンストラクタを使うと空のvector
が作成されます。
サイズを指定して初期化する場合は、vector<int> vec(10);
のように要素数を指定します。
全ての要素を特定の値で初期化するには、vector<int> vec(10, 5);
のようにします。
リスト初期化を使うと、vector<int> vec = {1, 2, 3};
のように直接値を指定できます。
vector
は動的配列として活用され、要素の追加や削除が容易で、サイズ変更が頻繁に行われる場面で特に有用です。
vector
はSTLの一部であり、効率的なメモリ管理と柔軟なデータ操作を提供します。
vectorの基本
C++のSTL(Standard Template Library)に含まれるvector
は、動的配列を実現するための非常に便利なコンテナです。
vector
は、要素の追加や削除が容易で、サイズを動的に変更できるため、固定サイズの配列に比べて柔軟性があります。
内部的には連続したメモリ領域を使用しており、ランダムアクセスが高速であるという特長を持っています。
vector
は、C++プログラムにおいて、データの管理や操作を効率的に行うための基本的なツールとして広く利用されています。
特に、要素数が事前に決まっていない場合や、頻繁に要素の追加・削除が行われる場合に、その利便性が発揮されます。
vectorの初期化方法
C++のvector
は、さまざまな方法で初期化することができます。
ここでは、代表的な初期化方法を紹介します。
これらの方法を理解することで、vector
を効率的に利用することが可能になります。
デフォルトコンストラクタによる初期化
デフォルトコンストラクタを使用すると、空のvector
を作成できます。
これは、後で要素を追加する場合に便利です。
#include <vector>
int main() {
std::vector<int> numbers; // 空のvectorを作成
return 0;
}
サイズ指定による初期化
vector
を特定のサイズで初期化することも可能です。
この場合、すべての要素はデフォルト値で初期化されます。
#include <vector>
int main() {
std::vector<int> numbers(5); // 5つの要素を持つvectorを作成
return 0;
}
値指定による初期化
サイズと初期値を指定してvector
を初期化することもできます。
すべての要素が同じ値で初期化されます。
#include <vector>
int main() {
std::vector<int> numbers(5, 10); // 5つの要素を持ち、すべての要素が10で初期化されるvector
return 0;
}
リスト初期化
C++11以降では、リスト初期化を使用してvector
を初期化することができます。
これにより、初期化リストを使って簡潔にvector
を作成できます。
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5}; // リスト初期化
return 0;
}
イテレータを使った初期化
他のコンテナや配列からイテレータを使ってvector
を初期化することができます。
これにより、部分的なコピーや変換が可能です。
#include <vector>
#include <array>
int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::vector<int> numbers(arr.begin(), arr.end()); // イテレータを使った初期化
return 0;
}
コピーコンストラクタによる初期化
既存のvector
をコピーして新しいvector
を作成することができます。
これにより、元のvector
の内容をそのまま複製できます。
#include <vector>
int main() {
std::vector<int> original = {1, 2, 3, 4, 5};
std::vector<int> copy(original); // コピーコンストラクタによる初期化
return 0;
}
これらの初期化方法を使い分けることで、vector
を柔軟に活用することができます。
vectorの活用法
C++のvector
は、動的配列としての特性を活かしてさまざまな操作が可能です。
ここでは、vector
の基本的な活用法を紹介します。
要素の追加と削除
vector
は、要素の追加や削除が簡単に行えます。
push_backメソッド
を使って末尾に要素を追加し、pop_backメソッド
で末尾の要素を削除できます。
また、insert
やerase
を使って特定の位置に要素を追加・削除することも可能です。
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers;
numbers.push_back(1); // 要素を追加
numbers.push_back(2);
numbers.pop_back(); // 要素を削除
numbers.insert(numbers.begin(), 0); // 先頭に要素を追加
numbers.erase(numbers.begin()); // 先頭の要素を削除
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
1
要素へのアクセス
vector
の要素には、インデックスを使ってアクセスできます。
atメソッド
を使うと、範囲外アクセス時に例外を投げるため、安全にアクセスできます。
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << numbers[2] << std::endl; // インデックスを使ったアクセス
std::cout << numbers.at(2) << std::endl; // 安全なアクセス
return 0;
}
3
3
サイズの変更
vector
のサイズは動的に変更可能です。
resizeメソッド
を使うと、vector
のサイズを変更できます。
サイズを増やす場合は、新しい要素がデフォルト値で初期化されます。
#include <vector>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3};
numbers.resize(5); // サイズを5に変更
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
1 2 3 0 0
メモリ管理の最適化
vector
は、内部的にメモリを管理しています。
reserveメソッド
を使うと、事前にメモリを確保して、頻繁な再割り当てを防ぐことができます。
これにより、パフォーマンスを向上させることができます。
#include <vector>
int main() {
std::vector<int> numbers;
numbers.reserve(10); // メモリを事前に確保
return 0;
}
ソートと検索
vector
は、sort関数
を使って簡単にソートできます。
また、find関数
を使って要素を検索することも可能です。
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> numbers = {5, 3, 1, 4, 2};
std::sort(numbers.begin(), numbers.end()); // ソート
for (int num : numbers) {
std::cout << num << " ";
}
auto it = std::find(numbers.begin(), numbers.end(), 3); // 検索
if (it != numbers.end()) {
std::cout << "\nFound: " << *it << std::endl;
} else {
std::cout << "\nNot found" << std::endl;
}
return 0;
}
1 2 3 4 5
Found: 3
これらの活用法を駆使することで、vector
を効果的に利用することができます。
vectorの応用例
C++のvector
は、その柔軟性と機能性から、さまざまな応用が可能です。
ここでは、vector
を使ったいくつかの応用例を紹介します。
動的配列としての利用
vector
は、動的にサイズを変更できる配列として利用できます。
要素の追加や削除が頻繁に行われる場合に特に有用です。
#include <vector>
#include <iostream>
int main() {
std::vector<int> dynamicArray;
for (int i = 0; i < 10; ++i) {
dynamicArray.push_back(i); // 動的に要素を追加
}
for (int num : dynamicArray) {
std::cout << num << " ";
}
return 0;
}
0 1 2 3 4 5 6 7 8 9
二次元配列の実装
vector
を使って二次元配列を実装することができます。
これは、行列やグリッドのようなデータ構造を扱う際に便利です。
#include <vector>
#include <iostream>
int main() {
std::vector<std::vector<int>> matrix(3, std::vector<int>(3, 0)); // 3x3の二次元配列を0で初期化
matrix[1][1] = 5; // 中央の要素に値を設定
for (const auto& row : matrix) {
for (int num : row) {
std::cout << num << " ";
}
std::cout << std::endl;
}
return 0;
}
0 0 0
0 5 0
0 0 0
スタックやキューの実装
vector
を使ってスタックやキューのデータ構造を実装することができます。
push_back
とpop_back
を使えばスタック、push_back
とerase
を使えばキューを実現できます。
#include <vector>
#include <iostream>
int main() {
std::vector<int> stack;
stack.push_back(1); // スタックにプッシュ
stack.push_back(2);
stack.pop_back(); // スタックからポップ
std::cout << "Stack top: " << stack.back() << std::endl;
std::vector<int> queue;
queue.push_back(1); // キューにエンキュー
queue.push_back(2);
queue.erase(queue.begin()); // キューからデキュー
std::cout << "Queue front: " << queue.front() << std::endl;
return 0;
}
Stack top: 1
Queue front: 2
データのフィルタリング
vector
を使って、特定の条件に基づいてデータをフィルタリングすることができます。
std::remove_if
とerase
を組み合わせることで、条件に合わない要素を削除できます。
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
numbers.erase(std::remove_if(numbers.begin(), numbers.end(), [](int x) { return x % 2 == 0; }), numbers.end()); // 偶数を削除
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
1 3 5
データの集約と統計処理
vector
を使って、データの集約や統計処理を行うことができます。
std::accumulate
を使って合計を計算したり、std::count_if
を使って条件に合う要素の数を数えたりできます。
#include <vector>
#include <numeric>
#include <iostream>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
int sum = std::accumulate(numbers.begin(), numbers.end(), 0); // 合計を計算
int count = std::count_if(numbers.begin(), numbers.end(), [](int x) { return x > 2; }); // 2より大きい要素の数を数える
std::cout << "Sum: " << sum << std::endl;
std::cout << "Count: " << count << std::endl;
return 0;
}
Sum: 15
Count: 3
これらの応用例を通じて、vector
の多様な利用方法を理解し、実際のプログラムで活用することができます。
まとめ
この記事では、C++のvector
の初期化方法や活用法、応用例について詳しく解説しました。
vector
は、動的配列としての柔軟性を持ち、さまざまな場面で効率的にデータを管理するための強力なツールです。
これを機に、vector
を活用したプログラムを実際に作成し、その利便性を体感してみてください。