GithubHelp home page GithubHelp logo

linq_lib_21_05's Introduction

LINQ

Реализована библиотека из нескольких классов и функций, которая позволяет обрабатывать последовательные данные в одну несложную команду, похожую по синтаксису на LINQ (Fluent interface) и по духу — на потоки Java 8.

Примеры

Пример 1:

int xs[] = { 1, 2, 3, 4, 5 };
std::vector<int> res =
  from(xs, xs + 5)  // Взять элементы xs
  .select([](int x) { return x * x; })  // Возвести в квадрат
  .where_neq(25)    // Оставить только значения != 25
  .where([](int x) { return x > 3; })   // Оставить только значения > 3
  .drop(2)          // Убрать два элемента из начала
  .to_vector();     // Преобразовать результат в вектор

Пример 2:

std::istream_iterator<int> in(std::cin), eof;
std::cout <<
  from(in, eof)  // Взять числа из входного потока
  .take(4)       // Не более четырёх чисел
  .until_eq(-1)  // Перестать читать после прочтения -1
  .to_vector();  // Получить список считанных чисел

Пример 3:

int xs[] = { 1, 2, 3, 4, 5 };
std::vector<double> res =
  from(xs, xs + 5)  // Взять элементы xs
  .select<double>([](int x) { return sqrt(x); })  // Извлечь корень
  .to_vector();     // Преобразовать результат в вектор

Пример 4:

std::istream_iterator<int> in(std::cin), eof;
std::ostream_iterator<double> out(std::cout, "\n");
from(in, eof)    // Взять числа из входного потока
.select([](int x) { return sqrt(x); })  // Извлечь из каждого корень
.copy_to(out);  // Вывести на экран

Поддерживаемые методы

  1. Генерация последовательностей:
  • template<typename T> ??? from(T begin, T end) — генерирует последовательность из STL-полуинтервала [begin; end). Исходный контейнер не должен изменяться никаким образом.
  1. Преобразования последовательностей:
  • .drop(count) — удаляет из последовательности первые count элементов. Если последовательность была короче, она становится пустой.
  • .take(count) — оставляет в последовательности только первые count элементов. В частности, из-за ленивости элемент count+1 никогда не должны быть запрошен у генератора последовательности. Если последовательность была короче, остаётся вся последовательность.
  • .select(f) — применяет функцию f к каждом элементу последовательности. f может изменять тип элемента — в таком случае требуется явное указание нового типа синтаксисом .select<T>(f) (как в примере 3). Вообще говоря, можно решить и без этого при помощи decltype и std::declval<>, но мы не будем.
  • .until(f) — обрывает последовательность, как только встретит элемент, удовлетворяющий предикату f, или если последовательность закончилась. В частности, из-за ленивости все последующие элементы никогда не должны спрашиваться у предыдущих команд.
  • .until_eq(v) обрывает последовательность, как только встретит элемент, равный v, или если последовательность закончилась.
  • .where(f) — оставляет в последовательности только те элементы, которые удовлетворяют предикату f. f — это произвольный функциональный объект (функция, функтор, лямбда).
  • .where_neq(v) — оставляет в последовательность только элементы, не равные v.
  1. Терминальные команды:
  • .to_vector() — собирает все элементы в вектор и возвращает его.
  • .copy_to(iter) — копирует сгенерированную последовательность в STL-подобный итератор iter (аналогично алгоритму std::copy). Например, это может быть ostream_iterator (пример 4), back_inserter или обычный итератор (если мы заранее знаем количество элементов).

Поддерживаемые типы

  • Все элементы, возникающие в процессе вычислений, имеют тип с:
    • Конструктором по умолчанию.
    • Конструктором копирования и оператором присваивания.
    • Опционально: конструктором перемещения и оператором перемещающего присваивания. По возможности следует использоавть их.
  • Все функторы поддерживают:
    • Вызов константного operator().
    • Перемещение.

Smoke-тесты

  • Представлен файл smoke_test.cpp для неполной проверки корректности решения. Если расположить его в папке lab_14/src, то следующая команда, запущенная из папки lab_14, должна завершиться успешно:

    g++ -std=c++17 -pedantic -Wall -Wextra -Werror src/smoke_test.cpp -Iinclude -o smoke_test && ./smoke_test && echo OK

linq_lib_21_05's People

Contributors

mamaria-k avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.