C++の標準テンプレートライブラリ(STL)は、プログラミングにおける一般的な問題を解決するための再利用可能なコンポーネントを提供します。これらのコンポーネントには、ベクタ、リスト、マップなどのコンテナ、さまざまなアルゴリズム、そしてそれらを操作するためのイテレータが含まれます。
STLを理解することで、より効率的で再利用可能なコードを書くことができ、プログラムのパフォーマンスと信頼性を向上させることができます。
プログラムを実行するための環境構築がまだの方は「C++を実行するための環境構築|初心者でも簡単!(Windows)」をご覧ください。
ベクタ(std::vector)
ベクタとは
ベクタは、動的配列を実装するためのSTLコンテナです。ベクタは、要素の追加や削除が頻繁に行われる場合に特に有用です。
#include <iostream>
#include <vector> // vectorライブラリをインクルードします。これにより、動的配列であるstd::vectorを使用できます
int main() {
std::vector<int> vec; // 空のベクタを作成
vec.push_back(1); // ベクタの末尾に要素を追加
vec.push_back(2);
vec.push_back(3);
// vec.size()はベクタの要素数(ここでは3)を返します。
for(int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << "\n"; // ベクタの要素を出力
}
return 0;
}
実行結果
1
2
3
ベクタは非常に便利なツールですが、要素の追加や削除が頻繁に行われる場合は、パフォーマンスに影響を及ぼす可能性があります。そのため、どのような状況でベクタを使用するべきかを理解することが重要です。
push_back
関数を使用して要素を追加し、[]
演算子を使用して要素にアクセスします。
イテレータの使い方
イテレータとは
イテレータは、STLコンテナの要素を順にアクセスするためのツールです。イテレータは、ポインタに似ていますが、より一般的な概念です。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3}; // ベクタを作成
//vec.begin()はベクタの最初の要素を指すイテレータを返し、vec.end()はベクタの最後の要素の次を指すイテレータを返します。
for(auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << "\n"; // ベクタの要素を出力
}
return 0;
}
実行結果
1
2
3
イテレータは、STLコンテナの要素を順にアクセスするための強力なツールです。しかし、イテレータが指す要素が存在しない場合(例えば、コンテナの末尾を超えて進めた場合)には、エラーが発生します。そのため、イテレータを安全に使用するためには、その範囲を正しく管理することが重要です。
begin
関数でイテレータを取得し、++
演算子で次の要素に移動します。
リスト(std::list)
リストとは
リストは、双方向連結リストを実装するSTLコンテナです。リストは、要素の追加や削除がリストの任意の位置で頻繁に行われる場合に特に有用です。
#include <iostream>
#include <list>
int main() {
std::list<int> lst; // 空のリストを作成
lst.push_back(1); // リストの末尾に要素を追加
lst.push_back(2);
lst.push_back(3);
for(auto it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << "\n"; // リストの要素を出力
}
return 0;
}
実行結果
1
2
3
リストは要素の挿入と削除が高速ですが、ランダムアクセス(例えば、リストの中央の要素に直接アクセスする)は遅いです。そのため、どのような状況でリストを使用するべきかを理解することが重要です。
マップ(std::map)
マップとは
マップは、キーと値のペアを保存するSTLコンテナです。マップは、キーを使用して迅速に特定の値にアクセスする必要がある場合に特に有用です。
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> map; // 空のマップを作成
map["apple"] = 1; // マップにキーと値のペアを追加
map["banana"] = 2;
map["cherry"] = 3;
for(auto it = map.begin(); it != map.end(); ++it) {
std::cout << it->first << ": " << it->second << "\n"; // マップのキーと値を出力
}
return 0;
}
実行結果
apple: 1
banana: 2
cherry: 3
[]
演算子を使用してキーと値のペアを追加し、->first
と->second
を使用してキーと値にアクセスします。
マップはキーと値のペアを保存するための強力なツールですが、キーの順序が重要でない場合や、キーの挿入と削除が頻繁に行われる場合は、std::unordered_map
の使用を検討すると良いでしょう。
アルゴリズム(sort, find, etc.)
アルゴリズムとは
STLは、さまざまな一般的なアルゴリズムを提供します。これらのアルゴリズムは、ソート、検索、変換など、データの操作に役立ちます。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {3, 1, 2}; // ベクタを作成
std::sort(vec.begin(), vec.end()); // ベクタをソート
for(auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << "\n"; // ソート後のベクタの要素を出力
}
auto it = std::find(vec.begin(), vec.end(), 2); // ベクタから特定の要素を検索
if(it != vec.end()) {
std::cout << "Found: " << *it << "\n"; // 見つかった要素を出力
} else {
std::cout << "Not found\n";
}
return 0;
}
実行結果
1
2
3
Found: 2
std::sort
関数でベクタをソートし、std::find
関数で特定の要素を検索します。
それぞれのアルゴリズムがどのように動作し、どのような状況で最も効果的であるかを理解することが重要です。
まとめ
- STLは、プログラミングにおける一般的な問題を解決するための再利用可能なコンポーネントを提供します。
- ベクタ、リスト、マップは、データを保存するためのSTLコンテナです。
- イテレータは、STLコンテナの要素を順にアクセスするためのツールです。
- STLは、ソート、検索、変換など、データの操作に役立つさまざまなアルゴリズムを提供します。
STLを理解することで、より効率的で再利用可能なコードを書くことができます。
この記事では、C++の標準テンプレートライブラリ(STL)について学びました。STLは、ベクタ、リスト、マップなどのコンテナ、さまざまなアルゴリズム、そしてそれらを操作するためのイテレータを提供します。しかし、それぞれのコンポーネントがどのように動作し、どのような状況で最も効果的であるかを理解することが重要です。これらの知識を持つことで、あなたのプログラミングスキルは大きく向上するでしょう。引き続き学習を頑張りましょう!
次のページ >> 【C++】テンプレートを解説
【C++】をより詳しく学びたい方はこちら >>【C++】入門書おすすめ3選!超初心者~中級者まで網羅!
プログラムを実行するための環境構築がまだの方は「C++を実行するための環境構築|初心者でも簡単!(Windows)」をご覧ください。
コメント