Разница между auto it = v.begin () и int it = v.begin (), где v - вектор <int> - PullRequest
0 голосов
/ 15 апреля 2020

Это выдало мне эту ошибку, когда я использовал int it = v.begin():

prog.cpp: In function ‘int findFrequency(std::vector<int>, int)’:
prog.cpp:18:32: error: cannot convert ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ to ‘int’ in initialization
     for(int iterator = v.begin();iterator!=v.end();iterator+

Но с auto it = v.begin() все работало нормально, почему?

Ответы [ 3 ]

4 голосов
/ 15 апреля 2020
 int it = v.begin()

неверно, поскольку тип, возвращаемый v.begin(), равен std::vector<int>::iterator, а не int

, в то время как

  auto it = v.begin()

выводит тип итератора

0 голосов
/ 15 апреля 2020

Запомните две точки:

  • v.begin() - это итератор, указывающий на первый элемент в вашем векторе v. Этот итератор, будучи векторным контейнером целочисленного типа, имеет вид std::vector<int>::iterator, а не int.
  • auto ключевое слово автоматически берет тип данных из своего инициализатора и назначает в качестве типа данных переменной, объявленной с ее использованием.

Возможные исправления / альтернативы?

  • Если вы хотели извлечь итератор в первый элемент в векторе затем либо придерживайтесь auto, либо определите итератор:
std::vector<int>::iterator it = v.begin();
  • Если вы хотите извлечь первый элемент , объявите его с типом данных, который будет int для вектора типа int: (как вы могли подумать, и как указано в smac89)
int it = v.front();

или вы можете снова использовать auto :

auto it = v.front();

В этом случае тип данных для it в соответствии с auto будет равен int, а тип v.front().

0 голосов
/ 15 апреля 2020

Это потому, что итераторы не являются целыми числами. Итератор - это указатель, который указывает на элемент в списке, такой как вектор.

Целое число - это просто целое число, 1, 2, 3, 4 ...

Вы не можете назначить итератор целого числа, так как они не совпадают. Вот ссылка , чтобы прочитать немного больше в итераторах

auto просто выведет сам тип, чтобы выяснить, что .begin() возвращает итератор.

...