C++ のベクトルで要素インデックスを検索する

胡金庫 2023年10月12日
  1. C++ のベクトルでカスタム関数を使用して要素インデックスを検索する
  2. C++ のベクトルで std::find アルゴリズムを使用して要素インデックスを検索する
  3. C++ のベクターで std::find_if アルゴリズムを使用して要素インデックスを検索する
C++ のベクトルで要素インデックスを検索する

この記事では、C++ でベクター内の要素インデックスを見つける方法のいくつかの方法について説明します。

C++ のベクトルでカスタム関数を使用して要素インデックスを検索する

カスタム線形検索関数を使用して、ベクトル内の特定の要素の位置を見つけることができます。これは、この問題を解決するにはかなり非効率的な方法であることに注意してください。次のサンプルコードでは、整数のベクトルを宣言し、呼び出しが成功した場合に出力する任意の要素位置を探します。

#include <iostream>
#include <string>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int findIndex(const vector<int> &arr, int item) {
  for (auto i = 0; i < arr.size(); ++i) {
    if (arr[i] == item) return i;
  }

  return -1;
}

int main(int argc, char *argv[]) {
  vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  auto pos = findIndex(arr, 32);
  pos != -1
      ? cout << "Found the element " << 32 << " at position " << pos << endl
      : cout << "Could not found the element " << 32 << " in vector" << endl;

  exit(EXIT_SUCCESS);
}

出力:

Could not found the element 32 in vector

C++ のベクトルで std::find アルゴリズムを使用して要素インデックスを検索する

または、STL ライブラリの一部である std::find アルゴリズムを使用することもできます。この関数は、条件を満たす最初の要素にイテレータを返します。一方、要素が見つからない場合、アルゴリズムは範囲の最後の要素を返します。ただし、返されたイテレータは、位置を計算するために begin イテレータでデクリメントする必要があります。

#include <iostream>
#include <string>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int findIndex2(const vector<int> &arr, int item) {
  auto ret = std::find(arr.begin(), arr.end(), item);

  if (ret != arr.end()) return ret - arr.begin();
  return -1;
}

int main(int argc, char *argv[]) {
  vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  auto pos2 = findIndex2(arr, 10);
  pos2 != -1
      ? cout << "Found the element " << 10 << " at position " << pos2 << endl
      : cout << "Could not found the element " << 10 << " in vector" << endl;

  exit(EXIT_SUCCESS);
}

出力:

Found the element 10 at position 9

C++ のベクターで std::find_if アルゴリズムを使用して要素インデックスを検索する

要素のインデックスを見つける別の方法は、std::find_if アルゴリズムを呼び出すことです。これは std::find に似ていますが、3 番目の引数が各反復要素を評価するための述語式になり得る点が異なります。式が true を返す場合、アルゴリズムは戻ります。要素が 10 に等しいかどうかをチェックする 3 番目の引数としてラムダ式を渡すことに注意してください。

#include <iostream>
#include <string>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main(int argc, char *argv[]) {
  vector<int> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  auto ret =
      std::find_if(arr.begin(), arr.end(), [](int x) { return x == 10; });

  if (ret != arr.end())
    cout << "Found the element " << 10 << " at position " << ret - arr.begin()
         << endl;

  exit(EXIT_SUCCESS);
}

出力:

Found the element 10 at position 9
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Vector