C++ で配列に要素が含まれているかどうかをチェックする

Shikha Chaudhary 2023年10月12日
  1. C++ で配列に要素が含まれているかどうかをループでチェックする
  2. C++ で std::find を使用して配列に要素が含まれているかどうかをチェックする
  3. C++ で Std::Count を使用して配列に要素が含まれているかどうかをチェックする
  4. C++ で std::binary_search を使用して配列に要素が含まれているかどうかをチェックする
  5. C++ で any_of() 関数を使用して配列に要素が含まれているかどうかをチェックする
  6. まとめ
C++ で配列に要素が含まれているかどうかをチェックする

C++ でアレイを操作しているときに、アレイに C++ の要素が含まれているかどうかを確認する必要がある場合もあります。これはループを使用して簡単に実行できますが、他の効率的な方法でも同じことができます。

この記事では、C++ の配列に要素が存在するかどうかを確認するさまざまな方法について説明します。読む。

C++ の標準ライブラリは、配列に C++ の要素が含まれているかどうかを確認するために使用できるいくつかのアルゴリズムと関数を提供します。しかし、最初に、ループを使用してこれを行う方法を見てみましょう。

C++ で配列に要素が含まれているかどうかをループでチェックする

for ループを使用して、物事を非常に単純に保つことができます。以下のコードには、points という名前の配列と、key という名前で検索する必要のある要素があります。

main ブロック内では、for ループを使用してすべての要素を直線的に調べます。各反復で、現在の要素が探している要素と同じであるかどうかを確認します。

key 要素が見つかると、ループが中断され、ブール変数 present の値が false に更新されます。後で、この変数 present の値に基づいて、目的の出力を出力します。

コード例:

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  bool present = false;
  for (int i : points) {
    if (i == key) {
      present = true;
      break;
    }
  }
  if (present) {
    cout << "The element is present";
  } else {
    cout << "The elment is not present";
    return 0;
  }

出力:

The element is present

これは配列内の要素を検索する最も簡単な方法ですが、同じことを行うための他のより良い方法があります。これらについては、次のセクションで説明します。

C++ で std::find を使用して配列に要素が含まれているかどうかをチェックする

std::find 関数は、主に特定の範囲の要素を検索するために使用されます。この関数は、範囲 [first, last) の間で必要な要素を検索します。

構文:

InputIterator find(InputIterator first, InputIterator last, const T& val);

以下は、std::find 関数を使用して配列内の要素を検索するコードです。ここでは、ブール変数 presentstd::find 関数を使用して、配列 points を反復処理します。

関数 std::find は 3つの引数を取ります:

  1. 変数 points は、アレイの初期位置の反復子として機能します
  2. points+x は、配列の最後の位置の反復子として機能します
  3. 検索する値である変数 key

値が見つからない場合、この関数は反復子を配列の最後に返しますが、変数 present 値に基づいて目的のステートメントを出力できます。

コード例:

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  int x = sizeof(points) / sizeof(*points);

  bool present = std::find(points, points + x, key) != points + x;

  if (present) {
    cout << "The element is present";
  } else {
    cout << "The element is not present";
  }
  return 0;
}

出力:

The element is present

上記の引数を渡すのがわかりにくい場合は、begin() 関数と end() 関数をそれぞれ使用して、配列の最初と最後に 2つの反復子を渡すこともできます。

コード例:

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  bool present = std::find(begin(points), end(points), key) != end(points);

  if (present) {
    cout << "The element is present";
  } else {
    cout << "The element is not present";
  }
  return 0;
}

出力:

The element is present

begin() および end() 関数を直接使用してコードを簡略化する方法をご覧ください。前のコードの引数と同じように機能します。

C++ で Std::Count を使用して配列に要素が含まれているかどうかをチェックする

もう 1つの方法は、アルゴリズム std::count を使用することです。基本的に、このアルゴリズムは、特定の範囲で要素が検出された回数をカウントします。

カウントの戻り値がゼロでない場合、これは要素が配列に存在することを意味します。std::count アルゴリズムは、範囲 [first, last) 間の要素の出現もカウントします。

構文:

int counter(Iterator first, Iterator last, T &val)

コードを見て、それがどのように機能するかを理解してください。

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  cout << std::count(begin(points), end(points), key);
}

出力:

2

この関数に必要な引数を渡し、結果を出力する方法をご覧ください。key56 は配列 points の 2つの場所に存在するため、出力は 2 として取得されます。

次に、これをブール変数 present とマージして、key 変数のカウントがゼロより大きいかどうかを確認します。はいの場合、それは単に要素が配列に存在することを意味します。

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  bool present = std::count(begin(points), end(points), key) > 0;

  if (present) {
    cout << "The element is present";
  } else {
    cout << "The element is not present";
  }
  return 0;
}

出力:

The element is present

当然、このアルゴリズムは、配列全体をトラバースして要素の数を見つけるため、std::find よりもパフォーマンスが遅くなります。

C++ で std::binary_search を使用して配列に要素が含まれているかどうかをチェックする

配列がソートされている場合、配列に C++ の要素が含まれているかどうかを確認する最も効率的な方法は、バイナリ検索アルゴリズムを使用することです。C++ の標準ライブラリは、同じことを行うための binary_search アルゴリズムを提供します。

std::binary_search アルゴリズムは、要素が [first, last) の範囲で見つかった場合、値 true を返します。それ以外の場合は、false を返します。

以下のコードでは、checkEle() という関数を作成しました。この関数内で、最初に sort() 関数を使用して配列をソートし、次に std::binary_search アルゴリズムを使用して key 要素を検索します。。

コード例:

#include <algorithm>
#include <iostream>
using namespace std;

bool checkEle(int a[], int x, int key) {
  if (x <= 0) {
    return false;
  }
  sort(a, a + x);
  return std::binary_search(a, a + x, key);
}

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  int x = sizeof(points) / sizeof(*points);

  bool present = checkEle(points, x, key);

  if (present) {
    cout << "The element is present";
  } else {
    cout << "The element is not present";
  }
  return 0;
}

出力:

The element is present

これは、配列がすでにソートされている場合にのみ役立ちます。これは、最初に sort() 関数を使用して配列をソートすると、時間の複雑さがさらに増すためです。

C++ で any_of() 関数を使用して配列に要素が含まれているかどうかをチェックする

any_of() 関数を使用して、述語が特定の範囲に存在する要素に準拠しているかどうかを確認できます。はいの場合、true を返します。それ以外の場合は、false を返します。

構文:

template <class InputIterator, class UnaryPredicate>
bool any_of(InputIterator begin, InputIterator end, UnaryPredicate p);

コードを見て、述語がどのように定義されているかを理解してください。ここでは、any_of() 関数を呼び出すとともに、現在の要素が検索している key と等しいかどうかを同時にチェックする and 条件も使用します。

いずれかの要素で条件が満たされると、ブール変数 present の値が true に更新されます。

#include <algorithm>
#include <array>
#include <iostream>
using namespace std;

int main() {
  int points[] = {23, 45, 56, 12, 34, 56};
  int key = 56;

  bool present =
      std::any_of(begin(points), end(points), [&](int i) { return i == key; });

  if (present) {
    cout << "The element is present";
  } else {
    cout << "The element is not present";
  }
  return 0;
}

出力:

The element is present

これは、any_of() 関数が配列内の要素を検索する方法です。これは、C++ で配列内の要素を検索する方法についてのすべてです。

まとめ

この記事では、配列に C++ の要素が含まれているかどうかを確認するためのさまざまなアプローチについて説明しました。C++ でこれに単純な for ループがどのように使用され、std::findstd::countstd::binary_search などのアルゴリズムでも機能することを確認しました。

ただし、これらの方法はすべて同じ目標を達成します。あなたが好きな最良のアプローチを決めるのは完全にあなた次第です。

関連記事 - C++ Array