Как работает 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 шт):
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) {
...
}