Spec-Zone.ru › C++

std::basic_string<CharT,Traits,Allocator>::substr

(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 is npos, returns [pos, size())
    std::string sub1 = a.substr(10);
    std::cout << sub1 << '\n';
 
    // both pos and pos + count are within bounds, returns [pos, pos + count)
    std::string sub2 = a.substr(5, 3);
    std::cout << sub2 << '\n';
 
    // pos is within bounds, pos + count is not, returns [pos, size())
    std::string sub4 = a.substr(a.size() - 3, 50);
    // this is effectively equivalent to
    // std::string sub4 = a.substr(17, 3);
    // since a.size() == 20, pos == a.size() - 3 == 17, and a.size() - pos == 3
 
    std::cout << sub4 << '\n';
 
    try
    {
        // pos is out of bounds, throws
        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++.

DR Применено к Поведение, как опубликовано Правильное поведение
LWG 847 C++98 гарантии исключительной безопасности не было добавлены гарантии сильной исключительной безопасности

См. также

copy
копирует символы
(публичный член-функция)
sizelength
возвращает количество символов
(публичный член-функция)
find
находит первое вхождение заданной подстроки
(публичный член-функция)
npos
[static]
специальное значение. Точное значение зависит от контекста
(публичная статическая константа-член)
substr
возвращает подстроку
(публичный член-функция std::basic_string_view<CharT,Traits>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/basic_string/substr

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API