Skip to content

Библиотека классов расширений для работы с последовательными и ассоциативными контейнерами. Имеет образовательный характер

Notifications You must be signed in to change notification settings

Slavyanchiks/stl-adapters

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Лабораторная работа

STL. Адаптеры.

Задача

Вам предстоит разработать библиотеку адаптеров для упрощенной работы с алгоритмами и контейнерами.

Зачастую стоит задача применения нескольких алгоритмов одновременно, например:

std::vector<int> v = {1,2,3,4,5,6};
std::vector<int> result;

std::copy_if(v.begin(), v.end(), std::back_inserter(result), [](int i){return i % 2;});
std::transform(result.begin(), result.end(), result.begin(), [](int i){return i * i;});

for(int i : result)
    std::cout << i << " ";

Эту задачу можно было бы решить более "элегантно"

std::vector<int> v = {1,2,3,4,5,6};

auto removed = v | filter([](int i){return i % 2;});
auto result = removed | transform([](int i){return i * i;});

for(int i : result)
    std::cout << i << " ";

или еще более коротко, использовав конвейер, наподобие того как это принято в unix-системах

std::vector<int> v = {1,2,3,4,5,6};

for(int i : v | filter([](int i){return i % 2;}) | transform([](int i){return i * i;}))
     std::cout << i << " ";

Еще одним значимым отличием такого подхода от изначального является то, что вычисления являются ленивыми, а создаваемые объекты не владеют массивом данных для решения данной задача. Подобный подход в частонсти применяется в классах std::string_view и std::span

Требуемые адаптеры

Адаптеры должны применяться к контейнерам, и выдвигать собственные требования к ним, которые должны проверяться с помощью метода static_assert

  • transform - изменяют значения элементов наподобие того как это делает алгоритм transform
  • filter - фильтрация по определенному признаку, признак передается в качестве аргумента
  • take - берет только N первых элементов
  • drop - пропускаем N первых элементов
  • reverse - реверсия
  • keys - ключи для ассоциативных контейнеров
  • values - значения для ассоциативных контейнеров

Тесты

Все вышеуказанные сущности должны быть покрыты тестами, с помощью фреймворка Google Test.

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

NB

  1. При реализации классов, для их использования в range-based for, они должны удовлетворять ряду требований.

  2. Решаемая вами задача является упрощенной реализацией библитеки std::ranges. Ее использование в данной работе запрешено, однако вы можете с ней ознакомиться и подчеркнуть ряд идей вашей реализации

About

Библиотека классов расширений для работы с последовательными и ассоциативными контейнерами. Имеет образовательный характер

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •