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")
.
Динамический массив с методами: append
, Sort
, GetRange
, Binsearch
и операторами +
, +=
, %
, /
.
Перегруженный <<
выводит список как в Python.
Пример:
#include "cs/types.h"
int main() {
List<int> nums = {1, 2, 3};
nums.append(4);
std::cout << nums << std::endl; // [1, 2, 3, 4]
nums.Sort();
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