Как работает auto в цикле и какое значение играют ссылки в цикле?

Есть код, который ищет в тексте латинские буквы и удаляет слова в случае, если они есть.

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include <stdio.h>
#include <string>
#include <sstream> 
using namespace std;

bool calcAlpha(const string& word)
{
    for (auto i = word.cbegin(); i != word.cend(); i++) {
        if (*i >= 65 && *i <= 90 || *i >= 97 && *i <= 122) {
        }
        else { 
            return false; 
        }
    }
}

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    string str;
    string temp;
    string result;
    cout << "Введите текст: "; cin >> str;
    istringstream is(str);
    while (is >> temp) 
        if (!calcAlpha(temp))
            result += temp + " ";
    cout << result << endl;

    system("pause");
    return 0;
}

Из того что я понимаю: функция принимает ссылку на строчку и возвращает булевое значение(true если есть латинская буква), в ней цикл который перебирает символы в строке word и если есть буква = true, else = false.

То, чего я не понимаю: как работает auto в цикле и какое значение играют ссылки в цикле?. Можно ли переделать цикл в обычном формате for(int i; i < условие; i++) или в foreach, к примеру?


Ответы (1 шт):

Автор решения: norix

auto i - инициализация переменной i, тип которой определяется из значения присваиваемого выражения.

В данном случае присваивается c.cbegin(), который возвращает итератор на начало строки и имеет тип string::const_iterator, потому auto i соответствует string::const_iterator i

&& - логическое И,

|| - логическое ИЛИ

*i - разыменование итератора с получением ссылки на указываемый символ строки.

// Если код символа >= 65 и <= 90 или код символа >=97 и <=122, то...
if (*i >= 65 && *i <= 90 || *i >= 97 && *i <= 122)

Для удобства записи, цикл с итераторами можно заменить на:

for (auto& i: word) {
...
}
→ Ссылка