std::string
является std::string::npos
. Давайте освежим, что это за константа и как её можно использовать.std::string::npos
— это статическая константа класса std::string
, представляющая максимально возможное значение для типа size_t
. Эта константа часто используется для индикации отсутствия позиции символа или подстроки в строке.Сама же константа объявлена как
-1
. Как же тогда она хранит максимально возможное значение size_t
? Дело в том, что size_t
не может хранить отрицательные числа. Поэтому значение -1
переходит как бы “по кругу” и становится самым большим числом, которое size_t
может хранить. Поэтому мы можем использовать -1
вместо string::npos
при работе со стандартными методами класса string
в C++.find
объекта std::string
возвращает позицию первого вхождения подстроки или символа в строке. Если подстрока или символ не найдены, метод возвращает std::string::npos
.std::string str = "Привет, мир!";
size_t pos = str.find("мир");
if (pos != std::string::npos) {
std::cout << "Подстрока найдена на позиции: " << pos << std::endl;
} else {
std::cout << "Подстрока не найдена." << std::endl;
}
// Подстрока найдена на позиции: 14
erase
объекта std::string
позволяет удалять подстроку из строки. Если вам нужно удалить все символы начиная с определенной позиции до конца строки, вы можете использовать std::string::npos
в качестве второго аргумента:std::string str = "Привет, мир!";
str.erase(12, std::string::npos);
std::cout << str << std::endl; // Вывод: "Привет"
// Привет
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18⚡3🔥3
Держите неплохой инструмент, позволяющий преобразовать плюсовый код в Java или Python.
Разумеется, всё работает за счёт AI
Тестите, пишите, как оно)
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍6🤔3🔥2
Вообще, это совершенно разные, хоть и взаимосвязанные, вещи.
New-expression - это встроенная конструкция языка, при помощи которой в языке С++ создаются объекты в динамической памяти. Например
int *p1 = new int();
SomeClass *p2 = new SomeClass[20];
А
operator new
(и operator new[]
) - это функции выделения "сырой" неинициализированной памяти, которые неявно вызываются изнутри new-expression. В упрощенной форме алгоритм работы new-expression состоит из двух этапов:operator new
/operator new[]
operator new
"сырую" память - например, путем вызова конструктора(-ов) создаваемого объекта(-ов).Стандартная библиотека предоставляет некую "базовую" реализацию функций
operator new
. Эти функции, при необходимости, также являются замещаемыми/перегружаемыми пользователем, в том числе индивидуально для каждого пользовательского класса.@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2⚡2
int main(){[](){}();}
А означает он следующее:
int main() // Функция main без аргументов.
{
[] // Объявление лямбда-функции без списка захвата...
() // ... с пустым списком аргументов ...
{} // ... и пустым телом, ...
(); // ... которая тут же вызывается.
}
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍45❤6🔥2⚡1
Эффективное использование С++
1. Библиотеки, утилиты, средства разработки, сборка (Эффективное использование С++)
2. Работа с памятью. Утечки ресурсов. RAII, умные указатели (Эффективное использование С++)
3. Move semantics, rvalue reference, perfect forwarding.
4. Callbacks: lambda, bind & function.
5. Multithreading in C++ (потоки, блокировки, задачи, атомарные операции, очереди сообщений)
6. Обзор возможностей современных стандартов C++
#video #cpp
https://www.youtube.com/watch?v=oPXn_n-lrzw&list=PLntPXGBtcaSj11jJWYiwCM2QyDG22SgXr
1. Библиотеки, утилиты, средства разработки, сборка (Эффективное использование С++)
2. Работа с памятью. Утечки ресурсов. RAII, умные указатели (Эффективное использование С++)
3. Move semantics, rvalue reference, perfect forwarding.
4. Callbacks: lambda, bind & function.
5. Multithreading in C++ (потоки, блокировки, задачи, атомарные операции, очереди сообщений)
6. Обзор возможностей современных стандартов C++
#video #cpp
https://www.youtube.com/watch?v=oPXn_n-lrzw&list=PLntPXGBtcaSj11jJWYiwCM2QyDG22SgXr
👍16🔥7❤3👎2⚡1
— запрет возврата из функции ссылок на временное значение,
—
[[indeterminate]]
и уменьшение количества Undefined Behavior,— диагностика при
=delete;
,— арифметика насыщения,
— линейная алгебра (да-да! BLAS и немного LAPACK),
— индексирование variadic-параметров и шаблонов
...[42]
,— вменяемый
assert(...)
,— и другие приятные мелочи.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍8🔥4⚡1
Держите реализацию на C++ таких шаблонов как:
• фабрика
• строитель
• абстрактная фабрика
• одиночка
• прототип
А вот немного о самих паттернах:
— разделяет создание сложного объекта и инициализацию его состояния так, что одинаковый процесс построения может создать объекты с разным состоянием.
— гарантирует, что класс имеет только 1 экземпляр и предоставляет глобальную точку доступа к нему.
— определяет несколько видов объектов, чтобы при создании использовать объект-прототип и создаёт новые объекты, копируя прототип.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤6🔥3👎2❤🔥1
Держите полезную статью, здесь мы рассматриваем две техники перехвата данных на уровне ОС. Они позволяют получить точную информацию о состоянии игровых объектов.
В то же время эти техники имеют несколько преимуществ над чтением данных из памяти процесса игры:
Эти техники перехвата WinAPI-вызовов можно использовать не только в алгоритме какого-нибудь бота, но и для исследования памяти процесса игрового приложения. Да и вообще, применений масса)
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥4🗿4👍1
https://github.com/16bit-ykiko/vscode-compiler-explorer
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥7❤5⚡2
=default
(для конструктора по умолчанию)X::X() {}
// и
X::X() = default;
#include <iostream>
#include <type_traits>
struct X {
//X() {}
X() = default;
int a;
int b;
};
int main( ) {
X x { 1, 2 }; // ошибка, если X - не тривиальный класс.
std::cout << std::boolalpha <<
std::is_trivial<X>::value << "\n";
}
При определении конструктора как
= default
тривиальность класса сохраняется, если она была до этого. В данном случае, это равносильно отсутствию явного упоминания конструктора в определении класса.Если конструктор по умолчанию определен как
= default
вне определения класса, всё равно будет считаться, что конструктор предоставлен пользователем, и это тоже делает класс нетривиальным.@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👌8👍7❤5⚡1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Простая реализация на C/C++ без зависимостей.
Особенности самой модели Whisper:
— Хорошо распознает русский текст (даже с вкраплениями английского)
— Хорошо распознает цифры
Кстати, интересный факт: Whisper.cpp был написан Георгием Гергановым всего за 5 дней
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤5🔥4⚡1
Многие полагаются на FetchContent и скрипты сборки для установки зависимостей, а ведь есть замечательный инструмент — Nix, который является и пакетным менеджером, и позволяет настраивать детерминированное окружение одной командой.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5⚡1🔥1