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