Namespaces
Variants

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

From cppreference.net
std::basic_string
(1)
basic_string substr ( size_type pos = 0 , size_type count = npos ) const ;
(до C++23)
(constexpr с C++20)
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 ( ) .

Если исключение выбрасывается по любой причине, эти функции не оказывают никакого эффекта ( strong exception safety guarantee ).

Сложность

Линейно по 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 Applied to Behavior as published Correct behavior
LWG 847 C++98 не было гарантии безопасности исключений добавлена строгая гарантия безопасности исключений

Смотрите также

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