閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

コンテナの中から任意の値を持つ要素のインデックスを取得する

std::find で要素を検索して、返ってきたイテレータを begin() で引いてやればいい。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;
    v.push_back(1), v.push_back(2), v.push_back(3), v.push_back(4), v.push_back(5);

    cout << std::find(v.begin(), v.end(), 3) - v.begin() << " 番目" << endl;
    
    return 0;
}

しかしこれだとコンテナのイテレータがランダムアクセスイテレータでないと動かないので、 std::distance を使用したほうが汎用的になってよいかと思います。

#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
    list<int> lst;
    lst.push_back(1), lst.push_back(2), lst.push_back(3), lst.push_back(4), lst.push_back(5);

    //cout << std::find(lst.begin(), lst.end(), 3) - lst.begin() << " 番目" << endl; // compile error
    cout << std::distance(lst.begin(), std::find(lst.begin(), lst.end(), 3)) << " 番目" << endl;
    
    return 0;
}

実際に使う場合は std::find が失敗したとき (値が見つからなかった時) のためのエラーチェックもちゃんと行いましょう。なお同じ値を持った要素が複数ある場合の挙動については何も考えていません (最初に見つかったインデックスが返ります)。仕様に応じて適当になんとかしてください。

さっき必要になったので書いてみたけれど、もっといい方法があったりして。