For auto c что это
Перейти к содержимому

For auto c что это

  • автор:

Что значит команда for (auto c:string)?

Нигде не могу найти ответ, гугл выдаёт не то. Объясните что она делает, для чего она нужна и её более понятную запись.

Лучшие ответы ( 2 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Margin:0 auto что значит?
Доброго времени суток! Не могу найти, что означает margin:0 auto. 0 это понятно, -нет полей, а 0.

Что значит эта команда
на Raspberry Pi cp /tmp/install/lib/* /lib/ -R Разъясните новичку пожалуйста.

Что значит команда time
пример использования команды time: Код Bash $ cd /usr/include $ time -р grep _POSIX_SOURCE.

Эксперт CЭксперт С++

5277 / 2364 / 342
Регистрация: 20.02.2013
Сообщений: 5,763
Записей в блоге: 20
mr_smith3122, это range-based for — цикл for, основанный на диапазоне.
223 / 188 / 97
Регистрация: 15.04.2018
Сообщений: 718

Лучший ответ

Сообщение было отмечено mr_smith3122 как решение

Решение

Она эквивалентна записи

for(auto c = string.begin(); c != string.end(); ++c)

Короткая запись, которую вы привели появилась в 11 стандарте
Она основана на итераторах, подробнее — гуглите.

Цикл проходит по всему массиву и выдает сам объект этого массива
т.е.

1 2 3 4
string s = "sdfgg"; for(auto c : s) cout  c;

Выведет тебе все элементы из списка s. Он поочередно возьмет каждый элемент (символ) и выведет его

Лучше использовать слова const и ссылочный тип для оптимизации. Такая запись будет быстрее (в теории) работать:

1 2 3 4
string s = "sdfgg"; for(const auto &c : s) cout  c;

Лично я его применяю в основном для обхода всего контейнера (вектор/лист/прочее) и взаимодействия с ним

[upd] gru74ik, удалите мою первую запись тут

Велосипедист.
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785

ЦитатаСообщение от mvngr Посмотреть сообщение

Она эквивалентна записи

for(auto c = string.begin(); c != string.end(); ++c)

Не-а ) Скорее так :

1 2 3 4 5 6 7 8 9 10 11
{ auto begin = string.begin() ; auto end = string.end () ; for ( ; begin != end ; ++begin ) { _declarator = *begin ; statements. } }

Где _declarator — переменная, которая стоит перед : .

Добавлено через 3 минуты
mvngr, Это я не прикопался. Важно понимать, что .begin() и .end() вызовутся лишь однажды — перед началом цикла. Исходя из этого, можно сделать вывод, что как-нибудь изменять размеры контейнеров не следует.

«C with Classes»
1641 / 1398 / 523
Регистрация: 16.08.2014
Сообщений: 5,855
Записей в блоге: 1

mr_smith3122, по мне так более понятная запись это запись основанная на индексах, так как концепция индексов проще чем концепция итераторов.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#include #include #include int main() { std::vectorint> vector {1, 2, 3}; for (auto i : vector) std::cout   <' '; std::cout  ::endl; for (std::size_t i = 0; i  vector.size(); ++i) std::cout  [i]  <' '; std::cout  ::endl; for (std::vectorint>::iterator it = vector.begin(); it != vector.end(); ++it) std::cout  <*it  <' '; std::cout  ::endl; return 0; }

For auto c что это

Ограничения типа также можно использовать для ограничения типов, вместо которых используются заменители auto , auto* и auto& . Причем везде, где используется auto, также можно указывать ограничение типа: для определения локальных переменных, для типа результат функции, в лямбда-выражениях и т. д. Всякий раз, когда конкретный тип, который будет применяться вместо auto , не удовлетворяет ограничению типа, компилятор выдает ошибку.

#include #include template concept Numeric = std::integral || std::floating_point; Numeric auto sum(Numeric auto a, Numeric auto b) < const Numeric auto result; return result; > int main() < std::cout 

Здесь определен концепт Numeric , который предполагает, что тип T должен представлять целое число ( std::integral ), либо число с плавающей точкой ( std::floating_point ).

В определении функции sum рядом с заместителем типа auto применяем данный концеп, ограничивая возможный набор используемых типов, только числовыми типами. Причем это делам для типа результата функции:

Numeric auto sum

Для типа параметров

(Numeric auto a, Numeric auto b)

Для константы внутри функции

const Numeric auto result;

Затем можно вызывать эту функцию sum, передавая в нее числа, как целые, так и с плавающей точкой:

sum(10, 3) // 13 sum(10.6, 3.2) // 13.8

Ключевое слово `auto`

Ключевое слово auto означает, что переменная находится в automatic storage и время жизни такой переменной local lifetime. Другими словами, мы указывали, что данная переменная лежит в стеке, но так как все переменные созданные в функциях как

int a = 10; 

уже и так подразумивается, что они стековые - то это ключевое слово безсмысленное.

Начиная с С++11

Начиная с С++11 ключевое слово auto обретает новую жизнь. Оно говорит, что компилятор на этапе компиляции должен определить тип переменной на основе типа инициализируемого выражения.

#include #include #include using namespace std; class Foo < public: Foo( int x ) < >>; int main() < std::vector> arr; auto a = 166LL; auto b = 'a' + true; auto c = Foo(3); auto d = arr.begin(); cout

Особенности auto

  1. Переменная auto должна быть объязательно проинициализирована
  2. Переменная auto не может быть класс-мембером
  3. Переменная auto не может быть параметром функции до С++14
    http://ideone.com/n7dZge
  4. Тип auto не может быть возвращаемым типом функции до С++14. http://rextester.com/AFDFD63587

Холивар

Cторонники: есть типы данных в С++, которые портят читаемость когда своей длинной (про итераторы std::vector, к примеру) и хотелось бы писать меньше. Для modern C++ в условиях метапрограммирования возможность возврата типа auto делает шаблон гибким.
Противники: тип auto бьет по читабельности кода. Приходится гадать, что за переменная и делать лишнее действие в IDE наводя мышкой, чтобы понять что за тип. Такого рода "динамический тип" встает в разрез определению, что С++ строготипизированный язык.

Я же за использование auto в меру. Не надо впадаться в крайности.

auto в C

Почему строка auto a = 1; воспринимается компилятором C как корректная?

Я пользуюсь MS Visual Studio 2012, и вот этот код:

int main(void)

компилируется без ошибок, несмотря на то, что я использую расширение *.c исходника. Т.е. таким образом, я создаю код на чистом C, а насколько мне известно использование auto без указания типа стало возможным только в C++11 – заметьте, в C++, а не C.

Означает ли это, что у меня не так настроен компилятор, или этот код действительно корректен в C?

Ответ

auto – это старое ключевое слово C, обозначающее “локальную область видимости”. auto a эквивалентно auto int a, а в силу того, что в данном примере область видимости ограничена блоком, в котором объявлена переменная, то это то же самое, что и просто int a.

Это ключевое слово перешло в C еще из его предка, B, в котором не существовало базовых типов, а все было int(*): сами int‘ы, указатели на них, массивы int‘ов и т.п. И объявлялось все с помощью auto и extern. Подход “все, что тут есть – это int” в C было решено оставить, поэтому int‘овые переменные можно объявить и так:

auto a; extern b; static c; 

В стандарте ISO C от подобного подхода отказались, однако многие компиляторы все еще поддерживают bacward-совместимость. Если это кажется вам странным, то вспомните о том, что вот такая строка будет корректной:

unsigned d; // на самом деле unsigend int 

В C++ это слово вернули, но уже с новым смыслом (теперь эта конструкция позволяет явно не указывать тип переменной), ведь вряд ли множество программистов использовало это слово с оригинальным значением, особенно если учесть, что от “всего, что ты видишь – это int” отказались уже в C++98. Единственным исключением осталось тогда auto T a, чем все равно никто не пользуется.

Если вам не лень и очень интересно, можете покопаться в истории языка за авторством Страуструпа.

Кстати, интересно было организовано хранение строк в B. Строка была массивом int‘ов, каждый элемент которого хранил несколько символов. Таким образом, B – это тот же BCPL с другим синтаксисом.

Следите за новыми постами по любимым темам

Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *