[C++] vector::size()の使い方 – 要素数を取得する
C++のvector::size()
は、std::vector
が保持する要素数を取得するためのメンバ関数です。
この関数は定数時間で実行され、返り値はsize_t
型です。
例えば、std::vector<int> v = {1, 2, 3};
の場合、v.size()
は3を返します。
要素数が0の場合でも正確に0を返すため、空のベクターかどうかを確認する際にも利用されます。
vector::size()の基本的な使い方
C++のstd::vector
は、動的配列を提供するコンテナであり、要素の追加や削除が容易です。
vector::size()
メソッドは、ベクターに格納されている要素の数を取得するために使用されます。
このメソッドは、ベクターの現在のサイズを返します。
以下に基本的な使い方を示します。
#include <iostream>
#include <vector>
int main() {
// 整数型のベクターを作成
std::vector<int> numbers;
// ベクターに要素を追加
numbers.push_back(10); // 10を追加
numbers.push_back(20); // 20を追加
numbers.push_back(30); // 30を追加
// ベクターのサイズを取得
std::cout << "ベクターの要素数: " << numbers.size() << std::endl; // size()を使用
return 0;
}
ベクターの要素数: 3
このコードでは、整数型のベクターnumbers
を作成し、3つの要素を追加しています。
size()
メソッドを使用して、ベクターの要素数を取得し、コンソールに出力しています。
size()
は、ベクターが現在保持している要素の数を返すため、動的に変化するデータの管理に非常に便利です。
vector::size()を使った実用例
vector::size()
メソッドは、さまざまな実用的なシナリオで役立ちます。
以下に、size()
を使用した具体的な例をいくつか示します。
これにより、ベクターのサイズを利用して、プログラムのロジックを構築する方法を理解できます。
1. 要素の存在確認
ベクター内に特定の要素が存在するかどうかを確認する際に、size()
を使ってループの条件を設定することができます。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
int target = 30; // 探したい要素
bool found = false;
// ベクターのサイズを使ってループ
for (size_t i = 0; i < numbers.size(); ++i) {
if (numbers[i] == target) {
found = true;
break; // 要素が見つかったらループを終了
}
}
if (found) {
std::cout << "要素 " << target << " はベクターに存在します。" << std::endl;
} else {
std::cout << "要素 " << target << " はベクターに存在しません。" << std::endl;
}
return 0;
}
要素 30 はベクターに存在します。
2. ベクターの要素を逆順に表示
size()
を使用して、ベクターの要素を逆順に表示することもできます。
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> fruits = {"リンゴ", "バナナ", "オレンジ"};
std::cout << "逆順のフルーツリスト:" << std::endl;
// ベクターのサイズを使って逆順に表示
for (size_t i = fruits.size(); i > 0; --i) {
std::cout << fruits[i - 1] << std::endl; // i-1でインデックスを調整
}
return 0;
}
逆順のフルーツリスト:
オレンジ
バナナ
リンゴ
3. ベクターのサイズを条件にした処理
ベクターのサイズを条件にして、異なる処理を行うことも可能です。
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores = {85, 90, 78, 92};
// ベクターのサイズを使って条件分岐
if (scores.size() > 3) {
std::cout << "スコアが4つ以上あります。" << std::endl;
} else {
std::cout << "スコアが3つ以下です。" << std::endl;
}
return 0;
}
スコアが4つ以上あります。
これらの例から、vector::size()
メソッドがどのように実用的な場面で役立つかを理解できるでしょう。
ベクターのサイズを利用することで、プログラムのロジックを柔軟に構築することが可能です。
vector::size()と範囲ベースforループ
C++11以降、範囲ベースのforループが導入され、ベクターの要素を簡潔に反復処理することができるようになりました。
vector::size()
メソッドと組み合わせることで、特定の条件に基づいて要素を処理することが可能です。
以下に、範囲ベースforループを使用した具体的な例を示します。
1. ベクターの要素を表示
範囲ベースforループを使用して、ベクターの全要素を表示する基本的な例です。
size()
はこの場合必要ありませんが、要素数を確認するために使用することもできます。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "ベクターの要素:" << std::endl;
for (const auto& number : numbers) {
std::cout << number << std::endl; // 各要素を表示
}
std::cout << "要素数: " << numbers.size() << std::endl; // size()を使用
return 0;
}
ベクターの要素:
1
2
3
4
5
要素数: 5
2. 条件に基づく要素の処理
範囲ベースforループを使用して、特定の条件を満たす要素のみを処理する例です。
この場合、size()
を使って要素数を確認することができます。
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores = {85, 90, 78, 92, 88};
std::cout << "80点以上のスコア:" << std::endl;
for (const auto& score : scores) {
if (score >= 80) {
std::cout << score << std::endl; // 80点以上のスコアを表示
}
}
std::cout << "スコアの数: " << scores.size() << std::endl; // size()を使用
return 0;
}
80点以上のスコア:
85
90
92
88
スコアの数: 5
3. ベクターのサイズを使ったループ制御
範囲ベースforループとsize()
を組み合わせて、特定の数の要素だけを処理する例です。
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> fruits = {"リンゴ", "バナナ", "オレンジ", "キウイ", "メロン"};
std::cout << "最初の3つのフルーツ:" << std::endl;
size_t count = 0; // カウンタを初期化
for (const auto& fruit : fruits) {
if (count >= 3) break; // 3つ以上処理しない
std::cout << fruit << std::endl; // フルーツを表示
++count; // カウンタをインクリメント
}
std::cout << "フルーツの数: " << fruits.size() << std::endl; // size()を使用
return 0;
}
最初の3つのフルーツ:
リンゴ
バナナ
オレンジ
フルーツの数: 5
これらの例から、vector::size()
メソッドと範囲ベースforループを組み合わせることで、ベクターの要素を効率的に処理する方法が理解できるでしょう。
特に、条件に基づく処理や、特定の数の要素を扱う際に非常に便利です。
vector::size()とエラー処理
vector::size()
メソッドは、ベクターの要素数を取得するために非常に便利ですが、ベクターを操作する際にはエラー処理も重要です。
特に、ベクターが空である場合や、サイズを基にしたインデックスアクセスを行う際には注意が必要です。
以下に、size()
を使用したエラー処理の具体例を示します。
1. 空のベクターのチェック
ベクターが空であるかどうかを確認するために、size()
メソッドを使用することができます。
空のベクターに対して操作を行うと、未定義の動作を引き起こす可能性があります。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers; // 空のベクターを作成
// ベクターが空かどうかをチェック
if (numbers.size() == 0) {
std::cout << "ベクターは空です。要素を追加してください。" << std::endl;
} else {
std::cout << "ベクターの要素数: " << numbers.size() << std::endl;
}
return 0;
}
ベクターは空です。要素を追加してください。
2. インデックスアクセスのエラー処理
size()
を使用して、インデックスアクセスを行う前に、ベクターのサイズを確認することで、範囲外アクセスを防ぐことができます。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30};
size_t index = 3; // アクセスしたいインデックス
// インデックスが範囲内かどうかをチェック
if (index < numbers.size()) {
std::cout << "インデックス " << index << " の要素: " << numbers[index] << std::endl;
} else {
std::cout << "エラー: インデックス " << index << " は範囲外です。" << std::endl;
}
return 0;
}
エラー: インデックス 3 は範囲外です。
3. 要素の削除後のサイズ確認
要素を削除した後に、ベクターのサイズを確認することで、適切な処理を行うことができます。
以下の例では、要素を削除した後にサイズを確認しています。
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
// 要素を削除
numbers.pop_back(); // 最後の要素を削除
// 削除後のサイズを確認
std::cout << "削除後の要素数: " << numbers.size() << std::endl;
// ベクターが空でないか確認
if (numbers.size() > 0) {
std::cout << "最初の要素: " << numbers[0] << std::endl;
} else {
std::cout << "ベクターは空です。" << std::endl;
}
return 0;
}
削除後の要素数: 4
最初の要素: 10
これらの例から、vector::size()
メソッドを使用してエラー処理を行う方法が理解できるでしょう。
ベクターのサイズを確認することで、空のベクターや範囲外アクセスを防ぎ、プログラムの安定性を向上させることができます。
まとめ
この記事では、C++のvector::size()
メソッドの基本的な使い方から、実用例、範囲ベースforループとの組み合わせ、エラー処理に至るまで、さまざまな側面を取り上げました。
これにより、ベクターのサイズを効果的に活用する方法が明らかになりました。
今後は、実際のプログラムにおいてsize()
を活用し、より安全で効率的なコードを書くことを目指してみてください。