All Projects → izvolov → Burst

izvolov / Burst

Licence: bsl-1.0
То, чего нет в Бусте

Projects that are alternatives of or similar to Burst

Competitive Programming Resources
This repository consists of data helpful for ACM ICPC programming contest, in general competitive programming.
Stars: ✭ 199 (+176.39%)
Mutual labels:  algorithms, stl
S25client
Return To The Roots (Settlers II(R) Clone)
Stars: ✭ 288 (+300%)
Mutual labels:  cmake, boost
Shiyanlou
学习C & C++ & python&汇编语言 LLVM编译器 数据结构 算法 操作系统 单片机 linux 面试
Stars: ✭ 1,909 (+2551.39%)
Mutual labels:  cmake, algorithms
Hazelcast Cpp Client
Hazelcast IMDG C++ Client
Stars: ✭ 67 (-6.94%)
Mutual labels:  cmake, boost
Assimp
The official Open-Asset-Importer-Library Repository. Loads 40+ 3D-file-formats into one unified and clean data structure.
Stars: ✭ 7,309 (+10051.39%)
Mutual labels:  cmake, stl
Iter
Go implementation of C++ STL iterators and algorithms.
Stars: ✭ 132 (+83.33%)
Mutual labels:  algorithms, stl
Vanilla Rtb
Real Time Bidding (RTB) - Demand Side Platform framework
Stars: ✭ 257 (+256.94%)
Mutual labels:  cmake, boost
Fixed point
C++ Binary Fixed-Point Arithmetic
Stars: ✭ 199 (+176.39%)
Mutual labels:  cmake, boost
Cmake Examples
Useful CMake Examples
Stars: ✭ 7,220 (+9927.78%)
Mutual labels:  cmake, boost
Innoextract
A tool to unpack installers created by Inno Setup
Stars: ✭ 407 (+465.28%)
Mutual labels:  cmake, boost
Functionalplus
Functional Programming Library for C++. Write concise and readable C++ code.
Stars: ✭ 1,286 (+1686.11%)
Mutual labels:  algorithms, stl
Stdex
std C++ 11 library impementation with extra features using only C++ 98 and POSIX threads
Stars: ✭ 43 (-40.28%)
Mutual labels:  boost, stl
Graphical Debugging
GraphicalDebugging extension for Visual Studio
Stars: ✭ 88 (+22.22%)
Mutual labels:  boost, stl
Algorithms
STL Algorithm Cheat Sheet + example code from STL Algorithm Video Series.
Stars: ✭ 136 (+88.89%)
Mutual labels:  algorithms, stl
Cmake Templates
Some CMake Templates (examples). Qt, Boost, OpenCV, C++11, etc 一些栗子
Stars: ✭ 368 (+411.11%)
Mutual labels:  cmake, boost
30 Seconds Of Cpp
30 Seconds of C++ (STL in C++). Read More about 30C++ here 👉
Stars: ✭ 815 (+1031.94%)
Mutual labels:  algorithms, stl
Bcm
Boost cmake modules
Stars: ✭ 48 (-33.33%)
Mutual labels:  cmake, boost
Coding Ninjas Data Structures And Algorithms In Python
Solved problems and assignments of DSA course taught by Coding Ninjas team
Stars: ✭ 70 (-2.78%)
Mutual labels:  algorithms
Awesome Decision Making Reinforcement Learning
A selection of state-of-the-art research materials on decision making and motion planning.
Stars: ✭ 68 (-5.56%)
Mutual labels:  algorithms
Spirit
Atomistic Spin Simulation Framework
Stars: ✭ 67 (-6.94%)
Mutual labels:  cmake

Burst

То, чего нет в Бусте.

Статус сборки Покрытие кода тестами Качество кода Попробовать онлайн на Wandbox.org

О проекте

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

В данном проекте я попытался собрать некоторые алгоритмы и инструменты, совместимые с СБШ и Бустом, которые нужны в повседневной работе, но которых пока нет ни в стандартной библиотеке, ни в библиотеке Boost, либо же они есть, но не устраивают с точки зрения интерфейса или производительности.

Содержание

  1. Что интересного?
    1. Целочисленные сортировки
    2. Динамический кортеж
    3. Ленивые вычисления над диапазонами
  2. Требования
  3. Установка
    1. Вариант 1: Скопировать исходники
    2. Вариант 2: Установить с помощью CMake
    3. Вариант 3: Подключить папку с проектом в CMake
    4. Вариант 4: CMake FetchContent

Что интересного?

Полный список интересных штук можно изучить в справочнике.

Целочисленные сортировки

Алгоритмы сортировок стандартной библиотеки std::sort и std::stable_sort являются классическими представителями сортировок, основанных на сравнениях. В то же время время существует другой класс алгоритмов, применимый к целым числам и не использующий в своей работе сравнения. Таким алгоритмом является поразрядная сортировка. И, хотя это такой же классический алгоритм, как, например, быстрая сортировка или сортировка подсчётом, реализации поразрядной сортировки, как правило, оставляют желать лучшего. Возможно, поэтому многие люди до сих пор считают поразрядку алгоритмом, представляющим исключительно академический интерес, и малоприменимым в реальности. Однако, это заблуждение.

Представленная в данной библиотеке реализация поразрядной сортировки существенно быстрее стандартных std::sort и std::stable_sort (и даже boost::integer_sort) при условии, что сортируются целые числа или доступно отображение из сортируемых элементов в целые числа.

Сравнение сортировок целых чисел

Подробнее про burst::radix_sort и burst::counting_sort.

Динамический кортеж

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

Никакая комбинация стандартных средств (tuple, vector, any) не позволяют добиться требуемого результата.

Поэтому был разработан класс burst::dynamic_tuple, удовлетворяющий всем этим требованиям, а соответствие данным требованиям означает оптимальность по занимаемой памяти и времени доступа к нужным объектам.

burst::dynamic_tuple t(std::string("123"));

t.push_back(std::vector<int>{1, 2, 3});
t.push_back(true);
t.push_back(123u);

assert(t.size() == 4);
assert(t.get<std::string>(0) == "123");
assert((t.get<std::vector<int>>(1) == std::vector<int>{1, 2, 3}));
assert(t.get<bool>(2) == true);

t.get<unsigned>(3) = 789u;
assert(t.get<unsigned>(3) == 789u);

Подробнее про burst::dynamic_tuple.

Ленивые вычисления над диапазонами

Периодически возникает потребность в работе с диапазонами как с множествами, то есть производить операции разности, слияния, объединения, пересечения и т.д. Стандартные средства (std::set_intersection и т.д.) умеют работать только с двумя диапазонами одновременно, а кроме того, память, в которую будет записан результат, должен быть известен заранее.

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

Доступные операции:

  1. Склейка
  2. Слияние
  3. Пересечение
  4. Полупересечение
  5. Объединение
  6. Разность
  7. Симметрическая разность

Подробнее про ленивые вычисления над диапазонами.

Требования

  1. Система сборки CMake версии 3.8.2 и выше;
  2. Компилятор GCC версии 6.2 и выше или компилятор Clang версии 3.9 и выше*;
  3. Библиотека тестирования doctest [Не обязательно**];
  4. Библиотека Boost (модуль program_options [Не обязательно***]) версии 1.62 и выше;
  5. Doxygen [Не обязательно].

Заведомо работающие конфигурации перечислены в интеграционном скрипте.

*) При работе с идущей в комплекте libc++ или libstdc++ версии 6 и выше.

**) Можно миновать этап сборки и тестирования, если при сборке с помощью CMake выключить опцию BURST_TESTING:

cmake -DCMAKE_BUILD_TYPE=Release path/to/burst -DBURST_TESTING=OFF

Также тестирование автоматически отключается в случае, если Burst подключается в качестве подпроекта.

***) Boost.Program_options не понадобится, если отключить этап сборки замеров производительности с помощью опции BURST_BENCHMARKING:

cmake ... -DBURST_BENCHMARKING=OFF

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

Установка

Возможны следующие три варианта установки.

Вариант 1: Скопировать исходники

Поскольку Burst — полностью заголовочная библиотека, то достаточно скопировать в нужную директорию все заголовки из папки include из репозитория и подключить их в свой проект.

Вариант 2: Установить с помощью CMake

cd path/to/build/directory
cmake -DCMAKE_BUILD_TYPE=Release path/to/burst
cmake --build . --target install

После этого в системе сборки CMake будет доступен пакет Burst:

find_package(Burst)

Эта команда породит интерфейсную библиотеку Burst::burst, которую можно использовать при подключении библиотек:

add_executable(program program.cpp)
target_link_libraries(program PRIVATE Burst::burst)

Вариант 3: Подключить папку с проектом в CMake

add_subdirectory("path/to/burst")

После этого в системе сборки CMake будет доступна цель Burst::burst, которую можно использовать при подключении библиотек:

add_executable(program program.cpp)
target_link_libraries(program PRIVATE Burst::burst)

Вариант 4: CMake FetchContent

Начиная с версии CMake 3.14 можно скачать и подключить репозиторий с зависимостью прямо во время сборки с помощью модуля FetchContent. В случае с библиотекой Burst это можно записать тремя командами:

include(FetchContent)
FetchContent_Declare(Burst GIT_REPOSITORY https://github.com/izvolov/burst.git)
FetchContent_MakeAvailable(Burst)

Этот набор команд породит интерфейсную библиотеку Burst::burst, которую можно использовать при подключении библиотек:

add_executable(program program.cpp)
target_link_libraries(program PRIVATE Burst::burst)
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].