C++でstd::vectorに要素が存在するか調べる方法のコード解説
C++でstd::vectorに要素が存在するか調べる方法
std::vectorはC++のコンテナクラスで、動的な配列のような機能を提供します。このコンテナに特定の要素が存在するかを調べる方法はいくつかあります。
**std::find()**を使用する
- **std::find()**は、指定した範囲内の要素を検索するアルゴリズムです。
- 戻り値は、検索に成功した場合には見つかった要素へのイテレータ、失敗した場合には範囲の終端へのイテレータになります。
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 3が存在するか調べる
auto it = std::find(numbers.begin(), numbers.end(), 3);
if (it != numbers.end()) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
- **std::count()**は、指定した範囲内の特定の要素の数を数えます。
- 存在するかどうかの判断は、結果が0でないかどうかでできます。
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 3が存在するか調べる
int count = std::count(numbers.begin(), numbers.end(), 3);
if (count > 0) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
- **std::any_of()**は、指定した範囲内の要素のうち、少なくとも1つが条件を満たすかどうかを調べます。
- ここでは、条件として要素が検索する値と等しいかどうかを使用します。
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 3が存在するか調べる
bool exists = std::any_of(numbers.begin(), numbers.end(), [](int x) { return x == 3; });
if (exists) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 3が存在するか調べる
auto it = std::find(numbers.begin(), numbers.end(), 3);
if (it != numbers.end()) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
- std::vector<int> numbers = {1, 2, 3, 4, 5};: 整数型の要素を5つ含むstd::vectorを作成します。
- auto it = std::find(numbers.begin(), numbers.end(), 3);: std::find()関数を使用して、numbersベクターの最初から最後まで3を探します。見つかった場合はその要素へのイテレータをitに格納し、見つからなかった場合はベクターの終端へのイテレータを格納します。
- if (it != numbers.end()): 見つかった場合、itはベクターの終端へのイテレータではないので、3は存在します。
- else: 見つからなかった場合、itはベクターの終端へのイテレータなので、3は存在しません。
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 3が存在するか調べる
int count = std::count(numbers.begin(), numbers.end(), 3);
if (count > 0) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
- std::count(numbers.begin(), numbers.end(), 3): std::count()関数を使用して、numbersベクターの最初から最後まで3の数を数えます。
- if (count > 0): 3の数が1以上であれば、3は存在します。
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 3が存在するか調べる
bool exists = std::any_of(numbers.begin(), numbers.end(), [](int x) { return x == 3; });
if (exists) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
- std::any_of(numbers.begin(), numbers.end(), [](int x) { return x == 3; }): std::any_of()関数を使用して、numbersベクターの最初から最後まで、少なくとも1つの要素が3であるかどうかを調べます。ラムダ式
[](int x) { return x == 3; }
は、要素が3であるかどうかを判定する条件を表します。 - if (exists): 少なくとも1つの要素が3であれば、3は存在します。
手動ループ
直接ループを使用して要素をひとつずつ比較する。
#include <vector>
std::vector<int> numbers = {1, 2, 3, 4, 5};
bool found = false;
for (int num : numbers) {
if (num == 3) {
found = true;
break;
}
}
if (found) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
二分探索 (std::binary_search)
ベクターがソートされている場合、二分探索を使用して効率的に検索できる。
#include <vector>
#include <algorithm>
std::vector<int> numbers = {1, 2, 3, 4, 5};
// ソート済みであることを前提とする
std::sort(numbers.begin(), numbers.end());
bool found = std::binary_search(numbers.begin(), numbers.end(), 3);
if (found) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
ハッシュテーブル (std::unordered_set)
要素の検索が高速なハッシュテーブルを使用する。
#include <vector>
#include <unordered_set>
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::unordered_set<int> set(numbers.begin(), numbers.end());
bool found = set.count(3) > 0;
if (found) {
std::cout << "3は存在します。" << std::endl;
} else {
std::cout << "3は存在しません。" << std::endl;
}
c++ std stdvector