Как преобразовать векторный итератор в int в C++

Я ищу элемент в векторе C++, и когда я его найду, я хочу получить индекс найденного элемента в числовой форме(целое число, float).

моя наивная попытка это :

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

этот код дает ошибку. Можете ли вы сказать мне, как я могу преобразовать iterator в int(если это возможно), или можете ли вы сказать мне, как я могу получить индекс найденного элемента другим способом? Спасибо.

3 ответов


вам нужно использовать стандартную функцию std::distance

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

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

старайтесь всегда использовать std::distance даже с итераторами произвольного доступа. Эта функция доступна в новых и старых стандартах C++.


Если вы хотите, чтобы индекс найденного элемента, то это расстояние от начала последовательности:

index = it - myvector.begin();

или, начиная с C++11,

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

который будет работать с любым типом прямого итератора, а не только с произвольным доступом, как у Вектора.


вы просто разыменовать итератор, как это

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 инициализирован, так что это приведет к неопределенному поведению.