[string.view.ops]

# 27 Strings library [[strings]](./#strings)

## 27.3 String view classes [[string.view]](string.view#ops)

### 27.3.3 Class template basic_string_view [[string.view.template]](string.view.template#string.view.ops)

#### 27.3.3.8 String operations [string.view.ops]

[ð](#lib:copy,basic_string_view)

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

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1180)

Let rlen be the smaller of n and size() - pos[.](#1.sentence-1)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1183)

*Preconditions*: [s, s + rlen) is a valid range[.](#2.sentence-1)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1187)

*Effects*: Equivalent to traits​::​copy(s, data() + pos, rlen)[.](#3.sentence-1)

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1191)

*Returns*: rlen[.](#4.sentence-1)

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1195)

*Throws*: out_of_range if pos > size()[.](#5.sentence-1)

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1199)

*Complexity*: O(rlen)[.](#6.sentence-1)

[ð](#lib:substr,basic_string_view)

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

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1212)

Let rlen be the smaller of n and size() - pos[.](#7.sentence-1)

[8](#8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1215)

*Effects*: Determines rlen, the effective length of the string to reference[.](#8.sentence-1)

[9](#9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1219)

*Returns*: basic_string_view(data() + pos, rlen)[.](#9.sentence-1)

[10](#10)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1223)

*Throws*: out_of_range if pos > size()[.](#10.sentence-1)

[ð](#lib:compare,basic_string_view)

`constexpr int compare(basic_string_view str) const noexcept;
`

[11](#11)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1234)

Let rlen be the smaller of size() and str.size()[.](#11.sentence-1)

[12](#12)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1237)

*Effects*: Determines rlen, the effective length of the strings to compare[.](#12.sentence-1)

The function then compares the two strings by calling traits​::​compare(data(), str.data(), rlen)[.](#12.sentence-2)

[13](#13)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1242)

*Returns*: The nonzero result if the result of the comparison is nonzero[.](#13.sentence-1)

Otherwise, returns a value as indicated in Table [88](#tab:string.view.compare "Table 88: compare() results")[.](#13.sentence-2)

Table [88](#tab:string.view.compare) — compare() results [[tab:string.view.compare]](./tab:string.view.compare)  

| [ð](#tab:string.view.compare-row-1)<br>**Condition** | **Return Value** |
| --- | --- |
| [ð](#tab:string.view.compare-row-2)<br>size() < str.size() | < 0 |
| [ð](#tab:string.view.compare-row-3)<br>size() == str.size() | 0 |
| [ð](#tab:string.view.compare-row-4)<br>size() > str.size() | > 0 |

[14](#14)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1252)

*Complexity*: O(rlen)[.](#14.sentence-1)

[ð](#lib:compare,basic_string_view_)

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

[15](#15)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1263)

*Effects*: Equivalent to: return substr(pos1, n1).compare(str);

[ð](#lib:compare,basic_string_view__)

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

[16](#16)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1275)

*Effects*: Equivalent to: return substr(pos1, n1).compare(str.substr(pos2, n2));

[ð](#lib:compare,basic_string_view___)

`constexpr int compare(const charT* s) const;
`

[17](#17)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1286)

*Effects*: Equivalent to: return compare(basic_string_view(s));

[ð](#lib:compare,basic_string_view____)

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

[18](#18)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1297)

*Effects*: Equivalent to: return substr(pos1, n1).compare(basic_string_view(s));

[ð](#lib:compare,basic_string_view_____)

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

[19](#19)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1308)

*Effects*: Equivalent to: return substr(pos1, n1).compare(basic_string_view(s, n2));

[ð](#lib:starts_with,basic_string_view)

`constexpr bool starts_with(basic_string_view x) const noexcept;
`

[20](#20)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1319)

Let rlen be the smaller of size() and x.size()[.](#20.sentence-1)

[21](#21)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1322)

*Effects*: Equivalent to: return basic_string_view(data(), rlen) == x;

[ð](#lib:starts_with,basic_string_view_)

`constexpr bool starts_with(charT x) const noexcept;
`

[22](#22)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1333)

*Effects*: Equivalent to: return !empty() && traits​::​eq(front(), x);

[ð](#lib:starts_with,basic_string_view__)

`constexpr bool starts_with(const charT* x) const;
`

[23](#23)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1344)

*Effects*: Equivalent to: return starts_with(basic_string_view(x));

[ð](#lib:ends_with,basic_string_view)

`constexpr bool ends_with(basic_string_view x) const noexcept;
`

[24](#24)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1355)

Let rlen be the smaller of size() and x.size()[.](#24.sentence-1)

[25](#25)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1358)

*Effects*: Equivalent to:return basic_string_view(data() + (size() - rlen), rlen) == x;

[ð](#lib:ends_with,basic_string_view_)

`constexpr bool ends_with(charT x) const noexcept;
`

[26](#26)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1372)

*Effects*: Equivalent to: return !empty() && traits​::​eq(back(), x);

[ð](#lib:ends_with,basic_string_view__)

`constexpr bool ends_with(const charT* x) const;
`

[27](#27)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1383)

*Effects*: Equivalent to: return ends_with(basic_string_view(x));

[ð](#lib:contains,basic_string_view)

`constexpr bool contains(basic_string_view x) const noexcept;
constexpr bool contains(charT x) const noexcept;
constexpr bool contains(const charT* x) const;
`

[28](#28)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/strings.tex#L1396)

*Effects*: Equivalent to: return find(x) != npos;
