24 Strings library [strings]

24.4 String view classes [string.view]

24.4.2 Class template basic_­string_­view [string.view.template]

template<class charT, class traits = char_traits<charT>>
class basic_string_view {
public:
  // types
  using traits_type            = traits;
  using value_type             = charT;
  using pointer                = value_type*;
  using const_pointer          = const value_type*;
  using reference              = value_type&;
  using const_reference        = const value_type&;
  using const_iterator         = implementation-defined; // see [string.view.iterators]
  using iterator               = const_iterator;228
  using const_reverse_iterator = reverse_iterator<const_iterator>;
  using reverse_iterator       = const_reverse_iterator;
  using size_type              = size_t;
  using difference_type        = ptrdiff_t;
  static constexpr size_type npos = size_type(-1);

  // [string.view.cons], construction and assignment
  constexpr basic_string_view() noexcept;
  constexpr basic_string_view(const basic_string_view&) noexcept = default;
  constexpr basic_string_view& operator=(const basic_string_view&) noexcept = default;
  constexpr basic_string_view(const charT* str);
  constexpr basic_string_view(const charT* str, size_type len);

  // [string.view.iterators], iterator support
  constexpr const_iterator begin() const noexcept;
  constexpr const_iterator end() const noexcept;
  constexpr const_iterator cbegin() const noexcept;
  constexpr const_iterator cend() const noexcept;
  constexpr const_reverse_iterator rbegin() const noexcept;
  constexpr const_reverse_iterator rend() const noexcept;
  constexpr const_reverse_iterator crbegin() const noexcept;
  constexpr const_reverse_iterator crend() const noexcept;

  // [string.view.capacity], capacity
  constexpr size_type size() const noexcept;
  constexpr size_type length() const noexcept;
  constexpr size_type max_size() const noexcept;
  constexpr bool empty() const noexcept;

  // [string.view.access], element access
  constexpr const_reference operator[](size_type pos) const;
  constexpr const_reference at(size_type pos) const;
  constexpr const_reference front() const;
  constexpr const_reference back() const;
  constexpr const_pointer data() const noexcept;

  // [string.view.modifiers], modifiers
  constexpr void remove_prefix(size_type n);
  constexpr void remove_suffix(size_type n);
  constexpr void swap(basic_string_view& s) noexcept;

  // [string.view.ops], string operations
  size_type copy(charT* s, size_type n, size_type pos = 0) const;

  constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;
  constexpr int compare(basic_string_view s) const noexcept;
  constexpr int compare(size_type pos1, size_type n1, basic_string_view s) const;
  constexpr int compare(size_type pos1, size_type n1, basic_string_view s,
                        size_type pos2, size_type n2) const;
  constexpr int compare(const charT* s) const;
  constexpr int compare(size_type pos1, size_type n1, const charT* s) const;
  constexpr int compare(size_type pos1, size_type n1, const charT* s,
                        size_type n2) const;
  constexpr size_type find(basic_string_view s, size_type pos = 0) const noexcept;
  constexpr size_type find(charT c, size_type pos = 0) const noexcept;
  constexpr size_type find(const charT* s, size_type pos, size_type n) const;
  constexpr size_type find(const charT* s, size_type pos = 0) const;
  constexpr size_type rfind(basic_string_view s, size_type pos = npos) const noexcept;
  constexpr size_type rfind(charT c, size_type pos = npos) const noexcept;
  constexpr size_type rfind(const charT* s, size_type pos, size_type n) const;
  constexpr size_type rfind(const charT* s, size_type pos = npos) const;
  constexpr size_type find_first_of(basic_string_view s, size_type pos = 0) const noexcept;
  constexpr size_type find_first_of(charT c, size_type pos = 0) const noexcept;
  constexpr size_type find_first_of(const charT* s, size_type pos, size_type n) const;
  constexpr size_type find_first_of(const charT* s, size_type pos = 0) const;
  constexpr size_type find_last_of(basic_string_view s, size_type pos = npos) const noexcept;
  constexpr size_type find_last_of(charT c, size_type pos = npos) const noexcept;
  constexpr size_type find_last_of(const charT* s, size_type pos, size_type n) const;
  constexpr size_type find_last_of(const charT* s, size_type pos = npos) const;
  constexpr size_type find_first_not_of(basic_string_view s, size_type pos = 0) const noexcept;
  constexpr size_type find_first_not_of(charT c, size_type pos = 0) const noexcept;
  constexpr size_type find_first_not_of(const charT* s, size_type pos,
                                        size_type n) const;
  constexpr size_type find_first_not_of(const charT* s, size_type pos = 0) const;
  constexpr size_type find_last_not_of(basic_string_view s,
                                       size_type pos = npos) const noexcept;
  constexpr size_type find_last_not_of(charT c, size_type pos = npos) const noexcept;
  constexpr size_type find_last_not_of(const charT* s, size_type pos,
                                       size_type n) const;
  constexpr size_type find_last_not_of(const charT* s, size_type pos = npos) const;

private:
  const_pointer data_; // exposition only
  size_type size_;     // exposition only
};

В каждой специализацииbasic_­string_­view<charT, traits>типtraits должен удовлетворять требованиям к характеристикам символов ([char.traits]), и типtraits​::​char_­type должен называть тот же тип, что иcharT.

Потому чтоbasic_­string_­view относится к постоянной последовательностиiterator иconst_­iterator относятся к одному типу.

24.4.2.1 Construction and assignment [string.view.cons]

constexpr basic_string_view() noexcept;

Effects: Создает пустойbasic_­string_­view.

Postconditions: size_­ == 0 иdata_­ == nullptr.

constexpr basic_string_view(const charT* str);

Requires: [str, str + traits​::​length(str)) допустимый диапазон.

Effects: Создает abasic_­string_­viewс постусловиями из Табл64.

Таблица64 -basic_­string_­view(const charT*) эффекты
ЭлементЦенить
data_­ str
size_­ traits​::​length(str)

Complexity: O(traits::length(str)).

constexpr basic_string_view(const charT* str, size_type len);

Requires: [str, str + len) допустимый диапазон.

Effects: Создает abasic_­string_­viewс постусловиями из Табл65.

Таблица65 -basic_­string_­view(const charT*, size_­type) эффекты
ЭлементЦенить
data_­ str
size_­ len

24.4.2.2 Iterator support [string.view.iterators]

using const_iterator = implementation-defined;

Тип, отвечающий требованиям постоянного итератора произвольного доступа ([random.access.iterators]) и непрерывного итератора ([iterator.requirements.general]), которыйvalue_­type является параметром шаблонаcharT.

Для abasic_­string_­view strлюбая операция, которая делает недействительным указатель в диапазоне,[str.data(), str.data() + str.size()) делает недействительными указатели, итераторы и ссылки, возвращаемые изstrметодов.

Все требования к контейнерным итераторам ([container.requirements]) также применимыbasic_­string_­view​::​const_­iterator .

constexpr const_iterator begin() const noexcept; constexpr const_iterator cbegin() const noexcept;

Returns: Итератор такой, что

  • если!empty(),&*begin() == data_­,

  • в противном случае - неопределенное значение, такое[begin(), end()) как допустимый диапазон.

constexpr const_iterator end() const noexcept; constexpr const_iterator cend() const noexcept;

Returns: begin() + size().

constexpr const_reverse_iterator rbegin() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept;

Returns: const_­reverse_­iterator(end()).

constexpr const_reverse_iterator rend() const noexcept; constexpr const_reverse_iterator crend() const noexcept;

Returns: const_­reverse_­iterator(begin()).

24.4.2.3 Capacity [string.view.capacity]

constexpr size_type size() const noexcept;

Returns: size_­.

constexpr size_type length() const noexcept;

Returns: size_­.

constexpr size_type max_size() const noexcept;

Returns: Максимально возможное количество символьных объектов, на которые может ссылаться abasic_­string_­view.

constexpr bool empty() const noexcept;

Returns: size_­ == 0.

24.4.2.4 Element access [string.view.access]

constexpr const_reference operator[](size_type pos) const;

Requires: pos < size().

Returns: data_­[pos].

Throws: Ничего такого.

[ Note: В отличие отbasic_­string​::​operator[], basic_­string_­view​::​operator[](size()) имеет неопределенное поведение вместо возвратаcharT(). ] end note

constexpr const_reference at(size_type pos) const;

Throws: out_­of_­range еслиpos >= size().

Returns: data_­[pos].

constexpr const_reference front() const;

Requires: !empty().

Returns: data_­[0].

Throws: Ничего такого.

constexpr const_reference back() const;

Requires: !empty().

Returns: data_­[size() - 1].

Throws: Ничего такого.

constexpr const_pointer data() const noexcept;

Returns: data_­.

[ Note: В отличие отbasic_­string​::​data() строковых литералов и, data() может возвращать указатель на буфер, не оканчивающийся нулем. Поэтому переходdata() к функции, которая принимает только aconst charT* и ожидает строку с завершающим нулем, является ошибкой . ] end note

24.4.2.5 Modifiers [string.view.modifiers]

constexpr void remove_prefix(size_type n);

Requires: n <= size().

Effects: Эквивалентен:data_­ += n; size_­ -= n;

constexpr void remove_suffix(size_type n);

Requires: n <= size().

Effects: Эквивалентен:size_­ -= n;

constexpr void swap(basic_string_view& s) noexcept;

Effects: Меняет значения*this иs.

24.4.2.6 String operations [string.view.ops]

size_type copy(charT* s, size_type n, size_type pos = 0) const;

Позвольтеrlen быть меньшим изn иsize() - pos.

Throws: out_­of_­range еслиpos > size().

Requires: [s, s + rlen) допустимый диапазон.

Effects: Эквивалентноtraits​::​copy(s, data() + pos, rlen).

Returns: rlen.

Complexity: O(rlen).

constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;

Позвольтеrlen быть меньшим изn иsize() - pos.

Throws: out_­of_­range еслиpos > size().

Effects: Определяетrlenэффективную длину строки для ссылки.

Returns: basic_­string_­view(data() + pos, rlen).

constexpr int compare(basic_string_view str) const noexcept;

Позвольтеrlen быть меньшим изsize() иstr.size().

Effects: Определяетrlenэффективную длину сравниваемых строк. Затем функция сравнивает две строки, вызываяtraits​::​compare(data(), str.data(), rlen).

Complexity: O(rlen).

Returns: Ненулевой результат, если результат сравнения отличен от нуля. В противном случае возвращает значение, указанное в таблице66.

Таблица66 -compare() результаты
СостояниеВозвращаемое значение
size() < str.size() < 0
size() == str.size()  0
size() > str.size() > 0

constexpr int compare(size_type pos1, size_type n1, basic_string_view str) const;

Effects: Эквивалентен:return substr(pos1, n1).compare(str);

constexpr int compare(size_type pos1, size_type n1, basic_string_view str, size_type pos2, size_type n2) const;

Effects: Эквивалентен:return substr(pos1, n1).compare(str.substr(pos2, n2));

constexpr int compare(const charT* s) const;

Effects: Эквивалентен:return compare(basic_­string_­view(s));

constexpr int compare(size_type pos1, size_type n1, const charT* s) const;

Effects: Эквивалентен:return substr(pos1, n1).compare(basic_­string_­view(s));

constexpr int compare(size_type pos1, size_type n1, const charT* s, size_type n2) const;

Effects: Эквивалентен:return substr(pos1, n1).compare(basic_­string_­view(s, n2));

24.4.2.7 Searching [string.view.find]

В этом разделе описываютсяbasic_­string_­view функции - члены с именем find,rfind,find_­first_­of,find_­last_­of,find_­first_­not_­of, иfind_­last_­not_­of.

Функции-члены в этом разделеO(size() * str.size()) в худшем случае сложны, хотя реализациям рекомендуется работать лучше.

Каждая функция-член формы

constexpr return-type F(const charT* s, size_type pos);

эквивалентноreturn F(basic_­string_­view(s), pos);

Каждая функция-член формы

constexpr return-type F(const charT* s, size_type pos, size_type n);

эквивалентноreturn F(basic_­string_­view(s, n), pos);

Каждая функция-член формы

constexpr return-type F(charT c, size_type pos);

эквивалентноreturn F(basic_­string_­view(&c, 1), pos);

constexpr size_type find(basic_string_view str, size_type pos = 0) const noexcept;

Позвольтеxpos быть самой низкой позицией, если возможно, такой, что выполняются следующие условия:

  • pos <= xpos

  • xpos + str.size() <= size()

  • traits​::​eq(at(xpos + I), str.at(I)) для всех элементовI строки, на которую ссылаетсяstr.

Effects: Определяетxpos.

Returns: xpos если функция может определить такое значение дляxpos. В противном случае возвращаетсяnpos.

constexpr size_type rfind(basic_string_view str, size_type pos = npos) const noexcept;

Позвольтеxpos быть высшей позицией, если возможно, такой, что выполняются следующие условия:

  • xpos <= pos

  • xpos + str.size() <= size()

  • traits​::​eq(at(xpos + I), str.at(I)) для всех элементовI строки, на которую ссылаетсяstr.

Effects: Определяетxpos.

Returns: xpos если функция может определить такое значение дляxpos. В противном случае возвращаетсяnpos.

constexpr size_type find_first_of(basic_string_view str, size_type pos = 0) const noexcept;

Позвольтеxpos быть самой низкой позицией, если возможно, такой, что выполняются следующие условия:

  • pos <= xpos

  • xpos < size()

  • traits​::​eq(at(xpos), str.at(I)) для некоторого элементаI строки, на которую ссылаетсяstr.

Effects: Определяетxpos.

Returns: xpos если функция может определить такое значение дляxpos. В противном случае возвращаетсяnpos.

constexpr size_type find_last_of(basic_string_view str, size_type pos = npos) const noexcept;

Позвольтеxpos быть высшей позицией, если возможно, такой, что выполняются следующие условия:

  • xpos <= pos

  • xpos < size()

  • traits​::​eq(at(xpos), str.at(I)) для некоторого элементаI строки, на которую ссылаетсяstr.

Effects: Определяетxpos.

Returns: xpos если функция может определить такое значение дляxpos. В противном случае возвращаетсяnpos.

constexpr size_type find_first_not_of(basic_string_view str, size_type pos = 0) const noexcept;

Позвольтеxpos быть самой низкой позицией, если возможно, такой, что выполняются следующие условия:

  • pos <= xpos

  • xpos < size()

  • traits​::​eq(at(xpos), str.at(I)) для ни одного элементаI строки, на которую ссылаетсяstr.

Effects: Определяетxpos.

Returns: xpos если функция может определить такое значение дляxpos. В противном случае возвращаетсяnpos.

constexpr size_type find_last_not_of(basic_string_view str, size_type pos = npos) const noexcept;

Позвольтеxpos быть высшей позицией, если возможно, такой, что выполняются следующие условия:

  • xpos <= pos

  • xpos < size()

  • traits​::​eq(at(xpos), str.at(I)) для ни одного элементаI строки, на которую ссылаетсяstr.

Effects: Определяетxpos.

Returns: xpos если функция может определить такое значение дляxpos. В противном случае возвращаетсяnpos.