Skip to content

Commit b403dd0

Browse files
committed
add basic_string::subview() and basic_string_view::subview(). (#1503)
1 parent 4aac573 commit b403dd0

File tree

5 files changed

+176
-0
lines changed

5 files changed

+176
-0
lines changed

reference/string/basic_string.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ namespace std {
145145
| [`find_first_not_of`](basic_string/find_first_not_of.md) | 先頭から、指定文字が見つからない位置を検索する | |
146146
| [`find_last_not_of`](basic_string/find_last_not_of.md) | 末尾から、指定文字が見つからない位置を検索する | |
147147
| [`substr`](basic_string/substr.md) | 部分文字列を取得する | |
148+
| [`subview`](basic_string/subview.md) | 部分文字列の[`std::basic_string_view`](/reference/string_view/basic_string_view.md)を構築する | C++26 |
148149
| [`compare`](basic_string/compare.md) | 他の文字列との比較を行う | |
149150
| [`starts_with`](basic_string/starts_with.md) | 指定の文字列で始まるかを判定する | C++20 |
150151
| [`ends_with`](basic_string/ends_with.md) | 指定の文字列で終わるかを判定する | C++20 |
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# subview
2+
* string[meta header]
3+
* std[meta namespace]
4+
* basic_string[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr basic_string_view<charT, traits>
10+
subview(size_type pos = 0,
11+
size_type n = npos) const;
12+
```
13+
14+
## 概要
15+
部分文字列の[`std::basic_string_view`](/reference/string_view/basic_string_view.md)を構築する。
16+
`pos`番目から`n`要素の[`std::basic_string_view`](/reference/string_view/basic_string_view.md)を返す。
17+
引数省略時は、先頭位置(`0`番目)から全要素(`npos`)の文字列を返す。
18+
19+
20+
## 要件
21+
`pos <=` [`size()`](size.md)
22+
23+
24+
## 効果
25+
次と等価 : `return` [`basic_string_view`](/reference/string_view/basic_string_view.md)`<charT, traits>(*this).`[`subview`](/reference/string_view/basic_string_view/subview.md)`(pos, n)`。
26+
27+
28+
## 注意
29+
本関数は使い方を誤ると、ぶら下がり参照が発生し得る。
30+
```cpp example
31+
#include <print>
32+
#include <string>
33+
#include <string_view>
34+
35+
int main() {
36+
// OK
37+
std::string s(3, 'A');
38+
std::string_view sv = s.subview();
39+
std::println("{}", sv);
40+
41+
// OK
42+
std::println("{}", std::string(3, 'A').subview());
43+
44+
// NG!
45+
std::string_view d = std::string(3, 'A').subview(); // ぶら下がり参照発生
46+
std::println("{}", d); // 不定動作
47+
}
48+
```
49+
50+
51+
##
52+
```cpp example
53+
#include <iostream>
54+
#include <string>
55+
#include <string_view>
56+
57+
int main() {
58+
std::string s = "Hello world!";
59+
60+
std::string_view sv = s.subview(6, 5);
61+
62+
std::cout << sv;
63+
}
64+
```
65+
* subview[color ff0000]
66+
67+
### 出力
68+
```
69+
world
70+
```
71+
72+
73+
## バージョン
74+
### 言語
75+
- C++26
76+
77+
### 処理系
78+
- [Clang](/implementation.md#clang): ??
79+
- [GCC](/implementation.md#gcc): ??
80+
- [ICC](/implementation.md#icc): ??
81+
- [Visual C++](/implementation.md#visual_cpp): ??
82+
83+
84+
## 参照
85+
86+
- [P3044R2 sub-string_view from string](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3044r2.pdf)
87+
88+
89+
## 関連項目
90+
- [`basic_string_view::subview`](/reference/string_view/basic_string_view/subview.md)

reference/string_view/basic_string_view.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ string_view hello = sv.substr(0, 5); // 先頭5文字を抽出する
9494
|------|------|----------------|
9595
| [`copy`](basic_string_view/copy.md) | 他の文字列に、自身の文字列をコピーする | C++17 |
9696
| [`substr`](basic_string_view/substr.md) | 部分文字列を取得する | C++17 |
97+
| [`subview`](basic_string_view/subview.md) | 部分文字列を取得する | C++26 |
9798
| [`compare`](basic_string_view/compare.md) | 他の文字列との比較を行う | C++17 |
9899
| [`starts_with`](basic_string_view/starts_with.md) | 指定の文字列で始まるかを判定する | C++20 |
99100
| [`ends_with`](basic_string_view/ends_with.md) | 指定の文字列で終わるかを判定する | C++20 |

reference/string_view/basic_string_view/substr.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,7 @@ int main()
6565
- [GCC](/implementation.md#gcc): 7.1 [mark verified]
6666
- [ICC](/implementation.md#icc): ??
6767
- [Visual C++](/implementation.md#visual_cpp): ??
68+
69+
70+
## 関連項目
71+
- [`subview`](subview.md)
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# subview
2+
* string_view[meta header]
3+
* std[meta namespace]
4+
* basic_string_view[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr basic_string_view<charT, traits>
10+
subview(size_type pos = 0,
11+
size_type n = npos) const;
12+
```
13+
14+
## 概要
15+
部分文字列を取得する。
16+
17+
本関数は[`substr`](substr.md)と全く同じ動作である。[`std::string`](/reference/string/basic_string.md)とインターフェースを揃える目的で追加された。
18+
19+
20+
## 戻り値
21+
指定された位置`pos`から`n`文字からなる部分文字列を構築して返す。
22+
23+
[`size()`](size.md) `- pos`と`n`うち、小さい方を`rlen`とし、`basic_string_view(`[`data()`](data.md) `+ pos, rlen)`を返す。
24+
25+
26+
## 例外
27+
`pos >` [`size()`](size.md)の場合、[`std::out_of_range`](/reference/stdexcept.md)例外を送出する。
28+
29+
30+
## 例
31+
```cpp example
32+
#include <iostream>
33+
#include <string_view>
34+
35+
int main()
36+
{
37+
std::string_view sv = "This is a pen";
38+
39+
std::string_view ret1 = sv.subview(5); // 5番目から最後までの文字列を取得
40+
std::string_view ret2 = sv.subview(5, 2); // 5番目から2文字の文字列を取得
41+
42+
std::cout << "1 : [" << ret1 << ']' << std::endl;
43+
std::cout << "2 : [" << ret2 << ']' << std::endl;
44+
45+
// subviewはデータを切り取るのではなく、参照位置と参照サイズを変更するだけなので、
46+
// 生ポインタを介せば全体の文字列を復元することはできる。
47+
const char* ret3 = ret1.data() - 5;
48+
std::cout << "3 : [" << ret3 << ']' << std::endl;
49+
}
50+
```
51+
* subview[color ff0000]
52+
* ret1.data()[link data.md]
53+
54+
### 出力
55+
```
56+
1 : [is a pen]
57+
2 : [is]
58+
3 : [This is a pen]
59+
```
60+
61+
62+
## バージョン
63+
### 言語
64+
- C++26
65+
66+
### 処理系
67+
- [Clang](/implementation.md#clang): ??
68+
- [GCC](/implementation.md#gcc): ??
69+
- [ICC](/implementation.md#icc): ??
70+
- [Visual C++](/implementation.md#visual_cpp): ??
71+
72+
73+
## 参照
74+
75+
- [P3044R2 sub-string_view from string](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3044r2.pdf)
76+
77+
78+
## 関連項目
79+
- [`substr`](substr.md)
80+
- [`basic_string::subview`](/reference/string/basic_string/subview.md)

0 commit comments

Comments
 (0)