String (C++)
У мові програмування C++, std::string є стандартним класом, який представляє текстовий рядок. Цей клас вирішує багато проблем, що виникають при роботі з рядками Сі-стилю, помістивши важку логіку управління пам'яттю на клас string
, а не на програміста, і дозволили додавати NUL байт у рядок. Клас реалізує деякі типові операції з рядками такі як порівняння, конкатенація, пошук і заміна, і функцію для отримання підрядків. Клас може бути побудований із рядка Сі-стилю, а рядок Сі-стилю може бути отримана з нього.
Стандартна бібліотека C++ |
---|
Стандартна бібліотека шаблонів |
|
Стандартна бібліотека С |
|
Рядки складаються з окремих символів C char, які як мінімум (і майже завжди) містять 8 бітів кожен. У сьогоднішньому застосуванні це часто не є "символом", а частиною багатобайтового кодування символів, такого як UTF-8.
Огляд функцій
string::string
(constructor) – Будує рядок із одного з різних джерел.string::~string
(destructor) – Знищує рядок.string::operator=
– Заміняє рядок.string::assign
– Заміняє рядок.string::get_allocator
– Повертає аллокатор, який використовується для виділення пам'яті під байтовий масив.
- Доступ до байтів
string::at
– Доступитися до вказаного байту з перевіркою меж масиву.string::operator[]
– Доступається до визначеного байту.string::front
– Доступається до першого байту.string::back
– Доступається до останнього байту.string::data
– Доступається до внутрішнього масиву.
- Ітератори
- Розмір
string::empty
– Перевіряє чи є рядок порожнім.string::size
– Повертає кількість байт в рядку.string::max_size
– Повертає максимум можливу кількість байт в рядку.string::reserve
– Reserves storage in the stringstring::capacity
– Returns the current reservationstring::shrink_to_fit
(C++11) – Зменшує використання пам'яті, шляхом звільнення пам'яті, що не використовується
- Модифікатори
string::clear
– Очищує вміст рядку.string::insert
– Вставляє послідовність байт або строку.string::erase
– Видаляє послідовність байт.string::push_back
– Додає байт в кінець рядка.string::append
– Додає байти або строку.string::operator+=
– Додає строку за допомогою оператора.string::pop_back
– Видаляє останній байт.string::resize
– Змінює кількість збережених байт.string::swap
– Заміняє входження рядку на інший рядок.
- Пошук
Використання
#include <iostream>
#include <string>
using namespace std;
int main()
{
string foo = "fighters";
string bar = "stool";
// "!=" порівнює вміст рядків на рівність, навіть якщо це різні об'єкти.
if (foo != bar)
{
cout << "The strings are different." << endl;
}
// Друкує рядок "stool fighters" створюючи тимчасовий рядок, який буде знищено автоматично.
cout << bar + " " + foo << endl;
return 0;
}
Оператор operator[]
повертає не константне посилання на один із байтів, яке можна використати для модифікації строки у будь-який час згодом, майже не можливо коректно реалізувати std::string
із відкритими масивами байтів на популярних архітектурах комп'ютерів, тому всі сучасні реалізації мають копію байтового масиву для рядку. Через це, копіювання рядка може займати час, який дорівнює O(n) (тобто, час копіювання рядка пропорційний розміру рядка). Це також призведе до виділення пам'яті у купі, що зазвичай відбувається ще довше ніж копіювання.
З цієї причини, рядок string
зазвичай передається як константне посилання, щоб уникнути небажаного копіювання:
void print_the_string(const string& str)
{
cout << str;
}
Для взаємодії з інтерфейсами мови C, зазвичай необхідно отримувати строки, що закінчуються на нуль із basic_string
. Функція класу c_str()
повертає вказівник на перший елемент масиву елементи якого, відповідають байтам початкового рядка string
і цей масив має 0 в кінці рядка. Якщо маркер завершення рядка не потрібен, метод data()
повертає вказівник без потреби указання нульового символу завершення рядка. Якщо рядок був змінений або його життєвий цикл завершився, вказівник, який був повернений цими методами стає недійсним.