Последнее обновление:2026-10-12
Глубокий анализ STL string¶
Работая с C++, мы хорошо знаем основы библиотеки
В заголовочном файле
Есть также строки фиксированной ширины, например std::u32string (то есть std::basic_string
В C++20 появился char8_t, а вместе с ним и std::u8string (то есть std::basic_string
C++11¶
В стандарте C++11 работа со строками опирается в основном на класс std::string — строковый класс с динамическим выделением памяти. Кроме того, были введены новые строковые типы фиксированной ширины, такие как std::u32string и std::u16string, обеспечившие лучшую поддержку символов Unicode.
#include <iostream>
#include <string>
int main() {
// 使用std::string
std::string str = "Hello, C++11!";
// 使用std::u32string和std::u16string
std::u32string u32str = U"Hello, Unicode!";
std::u16string u16str = u"Hello, Unicode!";
std::cout << str << std::endl;
std::wcout << u32str << std::endl;
std::wcout << u16str << std::endl;
return 0;
}
C++17¶
В C++17 появился заголовочный файл
Это особенно полезно в функциях, которым нужно читать строку, но не изменять её. Вместо того чтобы создавать для функции копию строки, мы можем просто просмотреть существующую строку! Более того,
#include <iostream>
#include <string>
#include <string_view>
void printString(std::string_view str) {
std::cout << str << std::endl;
}
int main() {
std::string_view strv{"strv"}; // C++ string_view
printString(strv);
std::string str{"str"}; // C++ string
printString(str);
char cstr[] = "cstr"; // C-style string
printString(cstr);
return 0;
}
Вывод:
В этом примере функция printString принимает std::string_view в качестве параметра, что делает её очень легковесной и гибкой: копии строки не создаются, а использовать функцию можно самыми разными способами, передавая C- и C++-строки.
C++20¶
В C++20 появились новые полезные функции-члены, включая starts_with(…) и ends_with(…). Как следует из названий, эти функции определяют, начинается ли / заканчивается ли строка (или представление строки) определённым символом или определённым std::string_view. Вот простой пример:
#include <cassert>
#include <string>
#include <string_view>
int main() {
const std::string str{"Hello World!"};
assert(str.starts_with('H'));
assert(str.ends_with('!'));
assert(str.starts_with("Hello")); // 隐式转换为std::string_view
assert(str.ends_with("World!")); // 隐式转换为std::string_view
return 0;
}
C++23¶
В C++23 появился contains, позволяющий проверять, содержит ли строка указанную подстроку.
// 这是一个假设的C++23示例,实际上并不可用
#include <iostream>
#include <string>
int main() {
std::string str = "C++23 introduces contains function.";
if (str.contains("introduces")) {
std::cout << "The string contains 'introduces'." << std::endl;
} else {
std::cout << "The string does not contain 'introduces'." << std::endl;
}
return 0;
}
https://en.cppreference.com/w/cpp/string/basic_string/contains
Заключение¶
Работая со строками в новом C++-коде, следует стремиться делать код максимально гибким и экономным по памяти. Использование
Похожие темы¶
- Анализ исходников STL array | C++那些事
- Разбор вопросов собеседования про STL string | C++那些事
- Анализ исходников STL deque | C++那些事
- Оптимизация пустого базового класса EBO в STL | C++那些事
- Реализация хеш-таблицы своими руками | C++那些事
- Хеш-таблица STL hashtable | C++那些事
- Анализ исходников STL итераторов | C++那些事
- Анализ исходников STL list | C++那些事
- STL map и multimap | C++那些事
- Анализ исходников STL queue и stack | C++那些事