Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/264: Рейтинг темы: голосов - 264, средняя оценка - 4.89
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Новый цикл for в C++11

17.12.2014, 00:46. Показов 51664. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С новым for'ом, умеющим работать с range, перебирать элементы контейнеров стало ещё проще и удобнее.
C++
1
2
3
4
5
6
7
8
9
10
11
/* Этот пример мне абсолютно понятен */
// C++98
for( vector<double>::iterator i = v.begin(); i != v.end(); ++i ) {
    total += *i;
}
 
/* Что происходит здесь, мне непонятно */
// C++11
for( auto d : v ) {
    total += d;
}
Приведите, пожалуйста, пример кода, который показывает работу цикла for в C++11.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2014, 00:46
Ответы с готовыми решениями:

Как перепрыгнуть новый цикл
Как мне создать цикл чтобы можно было влепить его в StringBuilder не задеваю другие циклы))) Через StringBuilder dd = new...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...

Разбить цикл записи на отрезки по 1000 строк в каждый новый файл
Господа, подскажите плж следующую весчь. имеется цикл строковой записи в файл. Строк например 15000 Нужно разбить цикл записи на...

38
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 03:58  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
Fixed.
Нет, совсем не fixed.
Просто авторы некоторых олимпиадных задач придумывают какую-нибудь изощрённую задачу, затем пишут её решение через векторы, засекают время работы программы, а потом переписывают решение с массивами. А потом наступает самый интересный момент: автор выставляет такое время в тестирующей системе, чтобы решение с вектором не прошло, а с массивом спокойно пролезло бы. Вот так-то.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
17.12.2014, 03:58
Цитата Сообщение от Cra3y Посмотреть сообщение
З.Ы.: можно не значит нужно
Это как посмотреть.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 03:59  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
если ОООЧЕЕНЬ хочется то можно так
Так не хочется, ибо так для меня непонятно.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
17.12.2014, 04:07
Если верить
Цитата Сообщение от DrOffset Посмотреть сообщение
Прямой адресный доступ это как раз то, что обеспечивает стандартный вектор. Операция индексации вектора - эквивалентна таковой операции обычного массива.
то мне трудно понять, как вектор может не пролезть там, где пролез массив. Разве что может "эквивалентна" - в смысле асимптотической сложности, что тоже доступ к n-му элементу порядка за О(1), но в массиве - за пару тактов, а в векторе - за 500 независимо от n?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
17.12.2014, 04:11
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А потом наступает самый интересный момент: автор выставляет такое время в тестирующей системе, чтобы решение с вектором не прошло, а с массивом спокойно пролезло бы. Вот так-то.
Без детального рассмотрения задачи все эти выводы могут оказаться ложными. Вот я о чем говорю.
Хочешь, давай сюда код, можно разобрать почему он вдруг стал просаживаться.

Важно понимать, что вектор реализован с помощью тех же самых массивов, а не с помощью какого-то колдунства. Да, там есть определенный дополнительный код, который в некоторых моментах, может дать задержку (например инициализация значениями по-умолчанию), но в большинстве случаев дело все-таки в том, что вектор был неправильно\неоптимально применен.

Огромное количество разоблачительных статей в интернете, содержали либо откровенную ложь, либо неправильный способ замера, либо неэквивалентный код. Случаи, где вектор действительно проседает, можно по пальцам пересчитать.
Очень важно делать выводы на доказуемых объективных фактах, а не на догадках и видимом поведении, и уж тем более не на мифах из интернета.

Добавлено через 2 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
то мне трудно понять, как вектор может не пролезть там, где пролез массив.
Вот я и говорю, что в 99% случаев из 100% он на самом деле пролезает, просто был неправильно применен. Такое случается довольно часто, чтобы считать это тенденцией. Случаев, когда вектор действительно не лезет только потому, что он вектор - единицы.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 04:14  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
то мне трудно понять, как вектор может не пролезть там, где пролез массив.
Разница во времени есть в миллисекундах. Если количество элементов массива огромное, то этого хватит, чтобы отправить решение в TL. Тут даже scanf и std::cin имеют значения, printf и std::cout, '\n' и std::endl, массив и вектор.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
17.12.2014, 04:16
Значит, ничего нового под луной - надо просто научиться правильно их готовить А перед этим еще бы неплохо узнать что это вообще такое за зверь И чем он не массив и чем он не список И зачем он тогда нужен вообще (Я не намекаю на ликбез в этой теме, просто мысли вслух, Страуструп вон лежит до сих пор неоткрыванный, хотя там запросто STL может отсутствовать )

Добавлено через 1 минуту
Dennis Ritchie, далеко не факт, что это основная причина. Может вы не увидели алгоритм, который с цаутами и векторами со свистом бы прошел, а влезли еле-еле, сэкономив на копейках.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
17.12.2014, 04:21
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
printf и std::cout
printf действительно быстрее работает, чем std::cout. А вот ты знаешь почему? Если нет, то это плохо. Т.к. первое, что ты должен был выяснить, после того как увидел разницу - причину. Настоящую причину такого поведения. А как только ты узнаешь причину, то у тебя появится возможность сделать так, чтобы std::cout начал обгонять printf.
0
17.12.2014, 04:26

Не по теме:

Мне недавно одна знакомая квалифицированная бабка поведала, что в своих проектах реального времени под микроконтроллеры иногда применяет отладочную печать в консоль принтф-ами (в дебаг моде), а в релизе условной компиляцией не инклюдит стдио. Но суть не в этом, а в том, что если тебе не надо принтф-ить флоаты и даблы, можно подынклюдить его без этих опций - и он станет в несколько раз легче и существенно быстрее :)

0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 04:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
А как только ты узнаешь причину, то у тебя появится возможность сделать так, чтобы std::cout начал обгонять printf
std::ios_base::sync_with_stdio
По-моему, в полной мере std::cout не будет обгонять printf никогда (за исключением нескольких случаев).
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.к. первое, что ты должен был выяснить, после того как увидел разницу - причину.
std::cout очищает буфер после выполнения: я так понял.

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Очень важно делать выводы на доказуемых объективных фактах, а не на догадках и видимом поведении, и уж тем более не на мифах из интернета.
Хорошо. Попробуйте решить данную задачу с векторами:
МюМатрица
Если получится, то я признаю, что я дурак.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
17.12.2014, 04:33
Можно попробовать сначала набить весь стринг в памяти а потом зацаутить его в файл за один раз. Не факт, что будет иметь смысл, но и не исключаю пока.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 04:39  [ТС]
Очень интересно узнать, сколько времени вам придётся "кряхтеть", чтобы решить "простенькую" олимпиадную задачку.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
17.12.2014, 04:48
Dennis Ritchie,
Во-первых std::cout - это глобальная переменная, определенная в библиотеке c++ runtime. Из-за этого теряется главное преимущество, многие вызовы не могут быть встроены.
Во-вторых потоки ввода вывода используют класс io-буфера с виртуальным интерфейсом. Это дизайн, нацеленный на расширение, но плата за это - снижение производительности. Виртуальные вызовы сами по себе накладнее обычных и встроится они не могут в силу неизвестности типа и возможности потенциальной замены конкретного объекта io-буфера.
В третьих, сама реализация io-буфера для нас скрыта, там может, скажем, предусмотрена межпоточная синхронизация при выводе на экран. В однопоточном окружении она не используется, но свою степень задержки привносить может. Конечно с таким же успехом ее может там и не быть. Это зависит от реализации.
А еще сам факт того, что это именно буферизированный ввод\вывод. Т.е. данные, сперва записываются в некий буфер, а потом уже сбрасываются в "устройство". printf конечно тоже буферизированный, но он может записать туда несколько аргументов одним махом, а std::cout - нет.

Ускорить std::cout можно, например, заменив стандартный буфер на свой, например реализовав ввод-вывод через api системы, чтобы исключить промежуточные вызовы из crt. Есть шанс если не перегнать, то хотя бы сравнятся засчет того, что printf все-таки приходится осуществлять парсинг форматной строки, а std::cout обладает нужной информацией о типах сразу.
А то, что std::endl срасывает буфер - это меньшая из всех проблем
2
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 04:56  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Во-первых...
Монолитно написано.
0
17.12.2014, 04:59

Не по теме:

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Попробуйте решить данную задачу с векторами
Обязательно, я даже зарегистрировался. Но только завтра. У меня на часах 5 утра, бодрствую уже 23 часа и через 5 часов на работу :)

0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
17.12.2014, 05:14
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Теперь я понял, почему никто не использует новый синтаксис цикла for, потому что он написан специально под std::vector
Это не так , он написан для типов у которых определены функции begin() и end(), возвращающие итераторы.

Добавлено через 1 минуту
А также применим к C-массивам и спискам инициализаторов.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
17.12.2014, 17:32  [ТС]
Цитата Сообщение от maxillion Посмотреть сообщение
Это не так , он написан для типов у которых определены функции begin() и end(), возвращающие итераторы.
Т. е. STL.
Цитата Сообщение от DrOffset Посмотреть сообщение
Обязательно, я даже зарегистрировался.
Буду ждать.

Добавлено через 12 часов 11 минут
DrOffset, чтобы решить эту задачу нужно использовать трёхмерный массив и операцию XOR (^).
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2014, 17:54
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Т. е. STL.
Нет. Любая сущность, у которой есть функции-члены begin/end (или же присутствует перегрузка свободных функций begin/end, которая может быть найдена используя ADL).
Возвращаемый данными фукнциями тип должен следовать концепции итератора конечно же.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.12.2014, 19:48
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
По старинке неинтересно. Теперь я понял, почему никто не использует новый синтаксис цикла for, потому что он написан специально под std::vector.
Он написан для всех контейнеров, поддерживающих методы begin() и end()

Добавлено через 2 минуты
Кстати, либа pugixml поддерживает данную концепцию. Можно перебирать все атрибуты или детей с помощью range-base for, что неописуемо удобно.

Выдрано с неё:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Range-based for loop support
template <typename It> class xml_object_range
{
public:
    typedef It const_iterator;
    typedef It iterator;
 
    xml_object_range(It b, It e): _begin(b), _end(e)
    {
    }
 
    It begin() const { return _begin; }
    It end() const { return _end; }
 
private:
    It _begin, _end;
};
Добавлено через 33 минуты
Вот тут пользовательский класс, использующий проход по итераторам.
Подсчитать средний балл студента
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2014, 19:48

Вычислить и вывести сумму чётных целых чисел в интервале от 1 до n: 1) цикл «ДО» 2) цикл «ПОКА» 3) цикл «ДЛЯ»
Вычислить и вывести сумму чётных целых чисел в интервале от 1 до n: 1. цикл «ДО» 2. цикл «ПОКА» 3. цикл «ДЛЯ»

Цикл с предусловием, цикл с постусловием и цикл с параметром
Объясните пожалуйста как делать эти циклы. У меня не получается. Можете сделать как на фото, или на подобии. Заранее спасибо)

Вместо письма новый заказ, приходит письмо: зарегистрирован новый пользователь
Удалил и добавил заново шаблон новый заказ, не помогло. В настройках события: &quot;новый заказ&quot; установлен нужный id шаблона. Но при...

Hdd Victoria, нет IDE режима. Новый комп и новый винт
Здравствуйте, проблема с новым компьютером - хотел проверить террабайтник новый, а как оказалось на новой материнке есть только uefi и...

Новый домен сейчас лучше прикрепить к старому сайту или поставить на новый сайт?
Доброго времени суток! итак, у меня есть сайт на укозе уже пол года. занимает в яндексе не плохие позиции, но сам сайт не очень. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru