Хабрахабр

[Перевод] Примеры C++ кода до и после Ranges

Снова здравствуйте. Перевод следующего материала подготовлен специально для студентов курса «Разработчик C++», занятия по которому стартуют уже 27 июня.

Библиотека предоставляет компоненты для обработки диапазонов значений, направленных на упрощение нашего кода. Библиотека Ranges была принята в C++20 на совещании стандартного комитета в Сан-Диего в ноябре прошлого года. Этот пост предназначен для ознакомления с примерами кода, написанного с использованием Ranges и без нее.
Реализация библиотеки Ranges Эрика Ниблера доступна здесь. К сожалению, библиотека Ranges не очень хорошо документирована, из-за этого ее труднее понять тем, кто хотел бы ее освоить. 6. Она работает с Clang 3. 2 или новее, и VC ++ 15. 2 или новее, gcc 5. Примеры кода ниже были написаны и протестированы с последними версиями компиляторов. 9 или новее. Стоит отметить, что эти примеры представляют собой типичные реализации и не обязательно являются единственными решениями, которые можно придумать.

Хотя стандартным пространством имен для библиотеки Ranges является std::ranges, в данной текущей реализации библиотеки оно ranges::v3.

Следующие псевдонимы пространства имен используются в примерах ниже:

namespace rs = ranges::v3;
namespace rv = ranges::v3::view;
namespace ra = ranges::v3::action;

Также, для упрощения, мы будем ссылаться на следующие объекты, функции и лямбды:

std::string to_roman(int value)
,{ 900, "CM" }, { 500, "D" },{ 400, "CD" }, { 100, "C" },{ 90, "XC" }, { 50, "L" },{ 40, "XL" }, { 10, "X" },{ 9, "IX" }, { 5, "V" },{ 4, "IV" }, { 1, "I" } }; std::string result; for (auto const & [d, r]: roman) { while (value >= d) { result += r; value -= d; } } return result;
} std::vector<int> v{1,1,2,3,5,8,13,21,34}; auto print_elem = [](auto const e) {std::cout << e << '\n'; }; auto is_even = [](auto const i) {return i % 2 == 0; };

АПДЕЙТ: Я хотел бы поблагодарить Эрика Ниблера и всех остальных, кто комментировал ниже, с предложениями для этих примеров кода. Я обновил несколько на основе их отзывов.

Вывести все элементы диапазона:

Выведите все элементы диапазона в обратном порядке:

Выведите только четные элементы диапазона, но в обратном порядке:

Пропустите первые два элемента диапазона и выведите только четные из следующих трех:

Выведите числа от 101 до 200:

Чтобы преобразовать число в соответствующее римское число, используется функция to_roman(), показанная выше. Выведите все римские цифры от 101 до 200.

Выведите римские цифры последних трех чисел, делимых на 7 в диапазоне [101, 200], в обратном порядке.

Создайте диапазон строк, содержащий римские цифры последних трех чисел, кратных 7 в диапазоне [101, 200], в обратном порядке.

Измените несортированный диапазон, чтобы он сохранял только уникальные значения, но в обратном порядке.

Удалите два наименьших и два самых больших значения диапазона и оставьте остальные, упорядоченные во втором диапазоне.

Объединить все строки в данном диапазоне в одно значение.

Подсчитайте количество слов (разделенных пробелом) в тексте.

Пишите в комментарии. Была ли статья полезной для вас?

Теги
Показать больше

Похожие статьи

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

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

Кнопка «Наверх»
Закрыть