Библиотека C/C++ разработчика
7.21K subscribers
686 photos
719 videos
8 files
983 links
Полезные материалы по всему, что может быть полезно плюсовику/сишнику. По всем вопросам @evgenycarter
加入频道
🔥 Как правильно сравнивать std::string в C++?

Доброй ночи! Давайте разберём важную тему – сравнение std::string в C++. Многие думают, что это просто (== и всё), но есть нюансы! Давайте разберёмся.

Способы сравнения строк

1️⃣ Оператор ==
Если вам нужно проверить точное совпадение строк:

std::string str1 = "hello";
std::string str2 = "hello";

if (str1 == str2) {
std::cout << "Строки равны!\n";
}

Этот метод безопасен, читабелен и работает быстро.

2️⃣ Функция compare()
Если нужно получить порядок строк в алфавитном сравнении:

std::string str1 = "apple";
std::string str2 = "banana";

if (str1.compare(str2) < 0) {
std::cout << "apple идет перед banana\n";
}

🔹 compare() возвращает:
- 0, если строки равны
- < 0, если str1 меньше str2
- > 0, если str1 больше str2

3️⃣ Сравнение без учета регистра
В C++ нет встроенного метода, но можно использовать std::transform:

#include <algorithm>
#include <cctype>
#include <string>

bool caseInsensitiveCompare(const std::string& a, const std::string& b) {
return std::equal(a.begin(), a.end(), b.begin(), b.end(),
[](char c1, char c2) { return std::tolower(c1) == std::tolower(c2); });
}

std::string str1 = "Hello";
std::string str2 = "hello";

if (caseInsensitiveCompare(str1, str2)) {
std::cout << "Строки равны без учета регистра!\n";
}


4️⃣ Сравнение подстрок
Если нужно проверить, начинается ли строка с подстроки:

std::string text = "hello world";
std::string prefix = "hello";

if (text.rfind(prefix, 0) == 0) {
std::cout << "Строка начинается с 'hello'!\n";
}

rfind(prefix, 0) == 0 проверяет, что prefix стоит в начале строки.

🚀 Итоги
Используйте == для простого сравнения
compare() – если важно узнать порядок
Для регистра – std::tolower()
Для подстрок – rfind()

Какой метод вы чаще используете? Делитесь в комментариях!

#cpp #programming

👉 @cpp_lib
👍8👏4
📌 Оптимизация кода: std::string_view вместо std::string

Привет, друзья! Сегодня хочу рассказать про std::string_view — полезный инструмент, который может значительно ускорить работу с строками в C++. Многие из вас, вероятно, используют std::string, но не всегда это лучший выбор.

Что такое std::string_view?
Это некопируемая, легковесная оболочка над строковыми данными. Она просто хранит указатель на начало строки и её длину, не создавая копии. Использование std::string_view вместо std::string позволяет избежать ненужных аллокаций памяти и ускорить код.

🔥 Пример использования:

#include <iostream>
#include <string_view>

void print(std::string_view str) { // Без лишнего копирования
std::cout << str << '\n';
}

int main() {
std::string s = "Hello, world!";
print(s); // Можно передавать std::string
print("Hi there"); // Можно передавать строковый литерал
}


🛠 Когда использовать?
При передаче строк в функции, если их не нужно модифицировать.
Для работы с подстроками (в отличие от std::string::substr, который делает копию).
Для обработки строк без создания динамических объектов.

⚠️ Важно помнить:
- std::string_view не владеет данными, поэтому нельзя использовать его для длительного хранения указателей на временные строки.
- Нужно быть осторожным с объектами, чей срок жизни может закончиться, пока std::string_view ещё используется.

🚀 Итог:
Использование std::string_view вместо const std::string& может ускорить работу с текстовыми данными и снизить нагрузку на аллокатор. Если не нужно изменять строку — это отличный выбор!

А вы уже используете std::string_view в своих проектах? Делитесь в комментариях! ⬇️

#cpp #programming

👉 @cpp_lib
👍5👏3
📌 5 способов ускорить компиляцию C++ проекта

Всем доброго вечера, или утра✌️Компиляция C++ — боль, особенно на больших проектах. Сегодня расскажу, как ускорить этот процесс.

🚀 1. Используйте ccache
🔹 ccache кеширует результаты компиляции и повторно использует их при неизменности исходного кода.
🔹 Установка (Linux/macOS):

sudo apt install ccache # для Ubuntu
brew install ccache # для macOS

🔹 Использование:

export CC="ccache g++"
export CXX="ccache g++"


2. Включите -j в make
🔹 Используйте make -jN, где N — количество потоков. Например:

make -j$(nproc) # на Linux
make -j$(sysctl -n hw.ncpu) # на macOS

🔹 Это позволяет компилятору использовать несколько ядер процессора.

🔥 3. Используйте pch (предкомпилированные заголовки)
🔹 Если у вас много инклудов в .cpp файлах, создайте pch файл:

// stdafx.h
#include <iostream>
#include <vector>
#include <map>


g++ -o stdafx.pch stdafx.h

🔹 Теперь подключайте stdafx.pch вместо кучи инклудов.

💨 4. Разделяйте сборку на модули
🔹 Используйте Unity Build (объединение нескольких .cpp в один).
🔹 Или попробуйте C++ модули (`export module`) в новых компиляторах.

🏎️ 5. Собирайте в Release с оптимизациями
🔹 Используйте -O2 или -O3, если важна скорость.
🔹 Для дебага — -Og:

g++ -Og -g main.cpp -o main


Как вы ускоряете сборку? Пишите в комментариях! 🚀

#cpp #programming

👉 @cpp_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤣2
🧑‍💻 C++ шпаргалка

🔹 Основы синтаксиса:
int main() { ... }
Комментарии: // однострочный или /* многострочный */

🔹 Ввод/вывод:
cin >> x; — ввод
cout << x; — вывод

🔹 Типы данных:
int, float, double, char, bool, string

🔹 Условия и циклы:
if, else, switch
for, while, do-while

🔹 Функции:
returnType name(args) { ... }

🔹 Массивы и векторы:
int arr[10];
vector<int> v;

🔹 Стандартные библиотеки:
#include <iostream>
#include <vector>
#include <algorithm>

🔹 STL:
Векторы, карты, множества, строки, стек и очередь

📎 Подробнее: https://www.geeksforgeeks.org/cpp-cheatsheet/

#cpp #programming

👉 @cpp_lib
👍9😁6👎2
Как правильно вызывать CUDA

Вероятно, вам уже попадались подобные руководства по CUDA: хрестоматийный пример «Hello World», в котором перемешан код для ЦП и графического процессора. Всё это сложено в один гетерогенный файл с исходниками на CUDA C++, а для запуска ядра применяется синтаксис NVCC с тройными угловыми скобками <<<>>>, который уже стал культовым:


#include <cuda_runtime.h>
#include <stdio.h>

__global__ void kernel() {
printf("Hello World from block %d, thread %d\n", blockIdx.x, threadIdx.x);
}

int main() {
kernel<<<1, 1>>>(); // Возвращает `void`?!
return cudaDeviceSynchronize() == cudaSuccess ? 0 : -1;
}

Время идёт, а такой паттерн по-прежнему попадается мне в продакшен-коде. Признаюсь, кое-где он всплывает и в моих любительских проектах — раз, два, три. Но это не лучшая идея, полагаться в серьёзном коде на запуск ядра через тройные угловые скобки. В таком случае программа не возвращает коды ошибок, поэтому может показаться обманчиво простой. Ниже вас ждут примерно 25 килобайт текста, в которых мы обсудим не самые корявые способы запуска ядер.

https://ashvardanian.com/posts/less-wrong-cuda-hello-world/

#cpp #programming

👉 @cpp_lib
👍51