Итератор VS const_iterator, используя его с distance ()

Просто вопрос об использовании const_iterator против просто итератора. Точнее с использованием расстояния (). Ниже приведен базовый код, который просто выводит список «fav_games», которые вводит пользователь (ранее в приложении). Я хотел также извлечь «индекс» вектора, чтобы распечатать нумерованный список.

Частичный код:

int main()
{
vector<string> fav_games;
vector<string>::const_iterator iter; // const_iterator no worky with "distance()"
if (fav_games.size() > 0)  {
cout << "\n\nCurrent game list: \n";
for (iter = fav_games.begin(); iter != fav_games.end(); ++iter)
{
cout << distance(fav_games.begin(), iter) << ". " << *iter << endl;
}
}

return 0;
}

Мой вопрос, почему «const_iterator» не будет работать, когда я вынужден вместо этого использовать «итератор». Ищите «теорию» за этим. «distance ()» выглядит ожидаемым, а «iterator» — не «const_iterator». ..Зачем?

Просто для справки об ошибке компиляции, если я использую «const_iterator»:

Ошибка 1 ошибка C2782: ‘iterator_traits<_Iter> :: diff_type std :: distance (_InIt, _InIt) ‘: параметр шаблона’ _InIt ‘является неоднозначным z: \ micah \ c ++ \ favgames \ favgames \ favgames.cpp 49 1 favgames

Спасибо!

0

Решение

Попробуйте это вместо этого:

vector<string>::const_iterator b, iter, e;

if (fav_games.size() > 0)  {
cout << "\n\nCurrent game list: \n";
for (b = fav_games.begin(), iter = b, e = fav_games.end(); iter != e; ++iter)
{
cout << distance(b, iter) << ". " << *iter << endl;
}
}

distance не имеет проблем с двумя const_iterator экземпляры или два iterator экземпляров. Ваша ошибка была в том, что они смешали их.

Тем не менее, делая O(n) звонки в distance это безумие Просто используйте счетчик:

vector<string>::const_iterator iter, e;
size_t i;

if (fav_games.size() > 0)  {
cout << "\n\nCurrent game list: \n";
for (i = 0, iter = fav_games.begin(), e = fav_games.end(); iter != e; (++iter), (++i))
{
cout << i << ". " << *iter << endl;
}
}

В C ++ 11 и более поздних версиях, конечно, можно пойти еще дальше и вообще избежать явного использования итераторов:

if (fav_games.size() > 0) {
int i = 0;
cout << "\n\nCurrent game list: \n";
for (const string& game : fav_games)
{
cout << (i++) << ". " << game << endl;
}
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector