Преобразование итератора в int

int i;
vector<string> names;
string s = "penny";
names.push_back(s);
i = find(names.begin(), names.end(), s);
cout << i;

Я пытаюсь найти индекс элемента в векторе. Это нормально, с iterators, но я хочу его как int. Как я могу это сделать?

5 ответов


можно использовать std::distance для этого.

i = std::distance( names.begin(), std::find( names.begin(), names.end(), s ) );

вы, вероятно, захотите проверить, что ваш индекс не выходит за рамки.

if( i == names.size() )
    // index out of bounds!

вероятно, это яснее сделать с итератором перед использованием std:: distance.

std::vector<std::string>::iterator it = std::find( names.begin(), names.end(), s );

if( it == names.end() )
     // not found - abort!

// otherwise...
i = std::distance( names.begin(), it );

std::vector<string>::iterator it = std::find(names.begin(), names.end(), s);
if (it != names.end()) {
    std::cout << std::distance(names.begin(), it);
} else {
    // ... not found
}

попробовать

i = (find( names.begin(), names.end(), s ) - names.begin());  

изменить: Хотя вы должны рассмотреть возможность использования vector:: size_type вместо int.


предположения, которые я делаю о коде:

using std::vector;
using std::cout;
using std::string;

если мои предположения верны, то вы можете find the distance С начала vector и iterator (по существу, индекс в vector при котором можно найти такой элемент):

using std::distance;

вот так...

vector<string>::iterator i = find(names.begin(), names.end(), s);
if (i != names.end())
{
    cout << "Index " << std::distance(names.begin(), i);
}
else
{
    cout << s << "not found";
}

вы можете просто разыменовать итератор

int i = *name;