Spec-Zone.ru › C++

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

basic_string substr( size_type pos = 0, size_type count = npos ) const;
(1) (до 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().

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

Сложность

Линейная относительно 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++.

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
LWG 847 C++98 гарантия безопасности при исключениях отсутствовала добавлена гарантия строгой безопасности при исключениях

См. также

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

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

Spec-Zone.ru

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