Пространства имён
Варианты
Действия

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

Материал из cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
Функции-элементы
Доступ к элементам
Итераторы
Ёмкость
Операции
basic_string::substr
Поиск
Константы
Правила вывода (C++17)
Функции, не являющиеся элементами
Ввод/Вывод
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
(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)

Возвращает подстроку [pospos + count). Если запрошенная подстрока выходит за пределы конца строки, т.е. count больше, чем size() - pos (например, если count == npos), возвращаемая подстрока равна [possize()).

1) Эквивалентно return basic_string(*this, pos, count);.
2) Эквивалентно return basic_string(std::move(*this), pos, count);.

Содержание

[править] Параметры

posпозиция первого символа, который будет включен
countдлина подстроки

[править] Возвращаемое значение

Строка, содержащая подстроку [pospos + count) или [possize()).

[править] Исключения

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 847C++98не было гарантии безопасности исключенийдобавлена надёжная гарантия безопасности исключений

[править] Смотрите также

копирует символы
(public функция-элемент) [править]
возвращает количество символов
(public функция-элемент) [править]
находит первое вхождение заданной подстроки
(public функция-элемент) [править]
[static]
специальное значение. Точное значение зависит от контекста
(public static константа-элемент) [править]
(C++17)
возвращает подстроку
(public функция-элемент std::basic_string_view<CharT,Traits>) [править]