std::basic_string<CharT,Traits,Allocator>::substr
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
| (1) | ||
basic_string substr( size_type pos = 0, size_type count = npos ) const; |
(до C++20) | |
constexpr basic_string substr( size_type pos = 0, size_type count = npos ) const; |
(начиная с C++20) (до C++23) |
|
constexpr basic_string substr( size_type pos = 0, size_type count = npos ) const&; |
(начиная с C++23) | |
constexpr basic_string substr( size_type pos = 0, size_type count = npos ) &&; |
(2) | (начиная с C++23) |
Возвращает подстроку [pos, pos + count). Если запрошенная подстрока выходит за пределы конца строки, т.е. count больше, чем size() - pos (например, если count == npos), возвращаемая подстрока равна [pos, size()).
1) Эквивалентно
return basic_string(*this, pos, count);.2) Эквивалентно
return basic_string(std::move(*this), pos, count);.Параметры
| pos | — | позиция первого символа, который будет включен |
| count | — | длина подстроки |
Возвращаемое значение
Строка, содержащая подстроку [pos, pos + count) или [pos, size()).
Исключения
std::out_of_range, если pos > size().
Если по какой-либо причине генерируется исключение, эти функции не имеют эффекта (строгая гарантия безопасности исключений).
Сложность
Линейная по count.
Примечание
Аллокатор возвращаемой строки создаётся по умолчанию: новый аллокатор может не быть копией get_allocator().
Пример
Запустить этот код
#include <iostream>
#include <string>
int main()
{
std::string a = "0123456789abcdefghij";
// count равно npos, возвращается [pos, size())
std::string sub1 = a.substr(10);
std::cout << sub1 << '\n';
// и pos, и pos + count находятся в пределах границ, возвращается [pos, pos + count)
std::string sub2 = a.substr(5, 3);
std::cout << sub2 << '\n';
// pos находится в пределах границ, pos + count нет, возвращается [pos, size())
std::string sub4 = a.substr(a.size() - 3, 50);
// это фактически эквивалентно
// std::string sub4 = a.substr(17, 3);
// поскольку a.size() == 20, pos == a.size() - 3 == 17, и a.size() - pos == 3
std::cout << sub4 << '\n';
try
{
// pos находится за пределами границ, генерируется исключение
std::string sub5 = a.substr(a.size() + 3, 50);
std::cout << sub5 << '\n';
}
catch (const std::out_of_range& ex)
{
std::cout << ex.what() << '\n';
}
}
Возможный вывод:
abcdefghij
567
hij
basic_string::substr: __pos (which is 23) > this->size() (which is 20)
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 847 | C++98 | не было гарантии безопасности исключений | добавлена надёжная гарантия безопасности исключений |
Смотрите также
| копирует символы (public функция-элемент) | |
| возвращает количество символов (public функция-элемент) | |
| находит первое вхождение заданной подстроки (public функция-элемент) | |
[static] |
специальное значение. Точное значение зависит от контекста (public static константа-элемент) |
(C++17) |
возвращает подстроку (public функция-элемент std::basic_string_view<CharT,Traits>)
|