Что значит команда 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.
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
- Переменная auto должна быть объязательно проинициализирована
- Переменная auto не может быть класс-мембером
- Переменная auto не может быть параметром функции до С++14
http://ideone.com/n7dZge - Тип 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 с другим синтаксисом.
Следите за новыми постами по любимым темам
Подпишитесь на интересующие вас теги, чтобы следить за новыми постами и быть в курсе событий.