C++ библиотека, которая приносит лаконичность C# коллекций в C++ код!
SharpPlusPlus — это List, Queue, string и куча фич, чтобы писать код, как будто ты в 2025 году. 🚀
SharpPlusPlus — библиотека, вдохновлённая C# коллекциями, с поддержкой:
-
📋 List — динамический массив с сортировкой, срезами и операциями.
-
📜 String — строка со срезами,
Splitи конкатенацией. -
🔢 BitArray — Для компактного хранения и моментальных манипуляций с булевыми значениями.
-
🗄️ Queue — простая очередь с
EnqueueиDequeue. -
🔗 LinkedList — Для эффективного добавления, удаления и доступа к элементам в двусвязном списке.
-
🌳 SortedDictionary — Сбалансированное бинарное дерево для упорядоченного хранения пар ключ-значение.
-
👥 Pair — пара значений любых типов с поддержкой сравнения и хэширования.
-
📖 Dictionary — хэш-таблица для быстрого доступа к значениям по ключу с рехешированием.
-
🗃️ HashSet — множество для уникальных элементов с быстрым поиском и вставкой.
-
📅 DateTime — класс для работы с датой и временем, с вычислением длительности и форматированием.
-
🖨️ print — обёртка над
std::coutс perfect forwarding для вывода чего угодно через запятую без копирования.
Плюс, автоматическая настройка UTF-8 для вывода на Windows (можно отключить через #define NO_INSTALL_UTF8) и поддержка срезов через Substr, operator() и operator[]. Для List и string перегружен оператор <<, что позволяет красиво выводить их в консоль, как списки в Python. 🛠️
📋 List - Динамический массив
📜 String - Строка
🔢 BitArray - Битовый массив
🗄️ Queue - Очередь (FIFO)
🔗 LinkedList - Двусвязный список
🌳 SortedDictionary - Сбалансированное бинарное дерево
👥 Pair - Пара значений
📖 Dictionary - Словарь
🗃️ HashSet - Множество
📅 DateTime — Дата и время
-
Склонируй репо (или скачай архивом, если лень):
git clone https://github.com/boykopovar/SharpPlusPlus
-
Скопируй папку
csв свой проект. -
Подключи библиотеку:
#include "cs/types.h"
Добавь файл cs/types.cpp в add_executable:
add_executable(YourTarget main.cpp cs/types.cpp)В одном из своих .cpp файлов, которые компилируются, подключи (только в одном):
#include "cs/types.cpp"Если UTF-8 не нужен, добавь перед каждым включением:
#define NO_INSTALL_UTF8
#include "cs/types.h"
⚠️ UTF-8 нюанс: Вывод UTF-8 работает стабильно (благодаря автоматической настройке кодировки, которую можно отключить), но ввод не-ASCII символов требует самостоятельной настройки, например,system("chcp 65001 > nul").
Динамический массив с методами: Add, Sort, GetRange, Binsearch и операторами +, +=, %, /.
Перегруженный << выводит список как в Python.
Пример:
#include "cs/types.h"
int main() {
List<int> nums = {3, 2, 1};
nums.Add(4);
nums.Sort();
std::cout << nums << std::endl; // [1, 2, 3, 4]
std::cout << nums[0] << std::endl; // 1
return 0;
}Строка с поддержкой UTF-8, срезов (Substr, operator(), operator[]), Split (по одному символу) и Find.
Перегруженный << красиво выводит строку.
Пример:
#include "cs/types.h"
int main() {
String s = "Hello, мир!";
std::cout << s.Split(",") << std::endl; // ["Hello", " мир!"]
std::cout << s(0, 6) << std::endl; // Hello
return 0;
}💡 Split принимает строку из одного символа (по умолчанию пробел).
Массив битов для компактного хранения и моментальных манипуляций.
Основные методы:
Set,Flip— установка и инверсия битов.AllTrue,HasTrue,TrueCount— проверка и подсчёт.ToString,ToNumber— преобразование в строку/число.
Операторы:
[]— доступ к битам (чтение/запись черезBitReference).<<— вывод строки битов.
Пример:
#include "cs/types.h"
int main() {
BitArray bits = {true, false, false, true}; // 1001
bits[2] = true; // 1011
std::cout << bits << std::endl; // 1011
std::cout << bits.TrueCount() << std::endl; // 3
return 0;
}Простая очередь с Enqueue и Dequeue.
Пример:
#include "cs/types.h"
int main() {
Queue<int> q;
q.Enqueue(42);
q.Enqueue(13);
std::cout << q.Dequeue() << std::endl; // 42
return 0;
}Двусвязный список с методами: AddFirst, AddLast, Remove, Find, First, Last.
Перегруженный << выводит список в формате [1, 2, 3].
Пример:
#include "cs/types.h"
int main() {
LinkedList<int> list = {1, 2, 3};
list.AddLast(4);
std::cout << list << std::endl; // [1, 2, 3, 4]
list.Remove(2);
std::cout << list.First() << std::endl; // 1
return 0;
}Сбалансированное бинарное дерево с методами: Insert, Remove, Find, ToList.
Хранит пары ключ-значение в упорядоченном виде.
Пример:
#include "cs/types.h"
int main() {
SortedDictionary<int, String> dict;
dict.Insert(1, "one");
dict.Insert(2, "two");
auto list = dict.ToList();
// [(1, one), (2, two)]
dict.Remove(1);
// [(2, two)]
return 0;
}Хэш-таблица, вдохновлённая C# и Python. Поддерживает пары ключ-значение, доступ через [], сравнение и хэширование. Рехеширование при заполнении >71%. Использует DictValueProxy для удобной работы с значениями.
Пример:
#include "cs/types.h"
int main() {
Dictionary<String, int> dict = {{"apple", 5}, {"banana", 3}};
dict["orange"] = 7;
std::cout << dict << std::endl; // [(orange, 7), (apple, 5), (banana, 3)]
std::cout << dict["banana"] << std::endl; // 3
return 0;
}💡 DictValueProxy позволяет читать/записывать значения через
[]с поддержкой операторов сравнения.
Хэш-множество с методами: Insert, Contains, ToList, Clear.
Перегруженный << выводит множество как список в Python.
Пример:
#include "cs/types.h"
int main() {
HashSet<int> set = {10, 20, 30};
set.Insert(40);
// [10, 20, 30, 40]
if (!set.Contains(50)) {
// true (50 отсутствует)
}
auto list = set.ToList();
// [10, 20, 30, 40]
return 0;
}Шаблонная структура для хранения двух значений любых типов (Item1, Item2). Поддерживает сравнение, хэширование и вывод в формате (Item1, Item2).
Пример:
#include "cs/types.h"
int main() {
Pair<String, int> pair = {"score", 42};
std::cout << pair << std::endl; // (score, 42)
Dictionary<Pair<String, int>, String> dict;
dict[pair] = "high";
std::cout << dict[pair] << std::endl; // high
return 0;
}💡 Хэширование позволяет использовать
Pairкак ключ вDictionary.
Класс для работы с датой и временем, поддерживает создание, манипуляции (следующий/предыдущий день, год), вычисление длительности и форматированный вывод. Хэшируется для Dictionary.
Перегруженный << выводит дату как строку (например, "2025.07.30 14:30:00").
Пример:
#include "cs/types.h"
int main() {
DateTime now = DateTime::Now();
DateTime event(2025, 7, 30, 14, 30);
std::cout << now.ToString() << '\n'; // 2025.08.01 09:03:00
std::cout << event.ToString() << '\n'; // 2025.07.30 14:30:00
std::cout << "Дней до события: " << now.Duration(event) << '\n';
}💡 Duration, NextDay, PreviousDay, NextYear игнорируют время, работают только с датой.
Функция для вывода любых типов с perfect forwarding. Не копирует аргументы, работает с любым количеством! Представляет собой минималистичную обёртку над std::cout.
Реализация:
template<typename T>
void print(T&& last) {
std::cout << last << std::endl;
}
template<typename T, typename... Args>
void print(T&& first, Args&&... args) {
std::cout << first << ' ';
print(std::forward<Args>(args)...);
}Пример:
#include "cs/types.h"
int main() {
print(42, "hello", 3.14); // 42 hello 3.14
return 0;
}- Минимализм — код выглядит чисто, без классического C++ нагромождения.
- UTF-8 — автоматическая поддержка (но на Windows ввод пока требует самостоятельной настройки).
- Срезы —
Substr,operator(),operator[]для удобной работы со строками и списками. - Perfect Forwarding —
printне копирует данные, сохраняя производительность. - C# Вайбик — коллекции, как в C#, но в C++!
- Красивый вывод —
ListиStringвыводятся в консоль прямо черезstd::cout(в случае List с аккуратным оформлением как вPython).
Хочешь улучшить? Форкай, пулл-реквесты приветствуются! 😎
GitHub: SharpPlusPlus