web-dev-qa-db-ja.com

C ++でベクトルイテレータをintに変換する方法

C++ベクトル内の要素を探していますが、それを見つけたら、見つかった要素のインデックスを数値形式(整数、浮動小数点数)で取得したいと思います。

私の素朴な試みはこれです:

int x;
int index;
vector<int> myvector;
vector<int>::iterator it;
it = find(myvector.begin(), myvector.end(), x);  
index = (int) * it;

このコードはエラーを与えています。イテレータをintに変換する方法(可能な場合)を教えてもらえますか、または見つかった要素のインデックスを他の方法で取得する方法を教えてもらえますか?ありがとう。

14
jason

標準関数std::distanceを使用する必要があります

index = std::distance( myvector.begin(), it );

if ( index < myvector.size() )
{
    // do something with the vector element with that index
}

ランダムアクセス反復子を使用する場合でも、常にstd::distanceを使用するようにしてください。この関数は、新旧のC++標準で使用できます。

27

見つかった要素のインデックスが必要な場合、それはシーケンスの開始からの距離です。

index = it - myvector.begin();

または、C++ 11以降、

index = std::distance(myvector.begin(), it);

これは、ベクトルからのようなランダムアクセス型だけでなく、任意のフォワードイテレータタイプで機能します。

10
Mike Seymour

このようにイテレータを逆参照するだけです

index = *it;

ただし、まず実際に何かを見つけたかどうかを確認する必要があります

it = find(myvector.begin(), myvector.end(), x);  
if (it != myvector.end())
{
    index = *it;
}

一致が見つかったインデックスを検索するには、見つかったポインターをベクトルの先頭から減算します。

it = find(myvector.begin(), myvector.end(), x);  
if (it != myvector.end())
{
    index = it - myvector.begin();  // Index from start of vector
}

また、xを定義した実際のコードでは、xが初期化されていないため、未定義の動作が発生することを示しました。

3
CoryKramer