- string_view[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp17[meta cpp]
namespace std {
template <class CharT, class Traits = char_traits<CharT>>
class basic_string_view;
using string_view = basic_string_view<char>;
using u16string_view = basic_string_view<char16_t>;
using u32string_view = basic_string_view<char32_t>;
using wstring_view = basic_string_view<wchar_t>;
}
- char_traits[link /reference/string/char_traits.md]
std::basic_string_viewは、文字列の所有権を保持せず、文字列のコピーを持つのではなく参照をして、参照先の文字列を加工して扱うクラスである。
文字配列型である文字列リテラルに対して、std::basic_stringクラスが持つような便利なメンバ関数群を使用できる。文字列リテラルは静的記憶域に保存されるため、文字列リテラルをこのクラスのオブジェクトに参照させて、そのオブジェクトを持ち回ったとしても参照先の文字列リテラルの寿命が尽きるような問題は発生しない。
string_view sv = "Hello World"; // この式の評価がおわったあとも、文字列リテラル "Hello World" の寿命は尽きない
string_view hello = sv.substr(0, 5); // 先頭5文字を抽出する
- sv.substr[link basic_string_view/substr.md]
このクラスの実装としては、文字配列の参照する先頭文字へのポインタと、文字数の2つをメンバ変数として持つ。これらの変数を変動させることによって、部分文字列の抽出や、限定された範囲内での検索といったことを実現する。
| 名前 |
説明 |
対応バージョン |
(constructor) |
コンストラクタ |
C++17 |
~basic_string_view() = default; |
デストラクタ |
C++17 |
basic_string_view& operator=(const basic_string_view&) = default; basic_string_view& operator=(basic_string_view&&) = default; |
代入演算子 |
C++17 |
| 名前 |
説明 |
対応バージョン |
begin |
先頭の要素を指すイテレータを取得する |
C++17 |
end |
末尾の次を指すイテレータを取得する |
C++17 |
cbegin |
先頭の要素を指す読み取り専用イテレータを取得する |
C++17 |
cend |
末尾の次を指す読み取り専用イテレータを取得する |
C++17 |
rbegin |
末尾を指す逆イテレータを取得する |
C++17 |
rend |
先頭の前を指す逆イテレータを取得する |
C++17 |
crbegin |
末尾を指す読み取り専用逆イテレータを取得する |
C++17 |
crend |
先頭の前を指す読み取り専用逆イテレータを取得する |
C++17 |
| 名前 |
説明 |
対応バージョン |
size |
文字列の長さを取得する |
C++17 |
length |
文字列の長さを取得する |
C++17 |
max_size |
参照可能な最大の文字列長を取得する |
C++17 |
empty |
文字列が空かどうかを判定する |
C++17 |
| 名前 |
説明 |
対応バージョン |
operator[] |
任意の位置の文字を取得する |
C++17 |
at |
任意の位置の文字を取得する |
C++17 |
front |
先頭文字を取得する |
C++17 |
back |
末尾文字を取得する |
C++17 |
data |
文字配列表現を取得する |
C++17 |
| 名前 |
説明 |
対応バージョン |
npos |
無効な位置を表す。findやsubstrなどで使われる。
static const size_type npos = -1; |
C++17 |
| 名前 |
説明 |
対応バージョン |
traits_type |
文字特性型 Traits |
C++17 |
value_type |
文字型 CharT |
C++17 |
pointer |
ポインタ型 value_type* |
C++17 |
const_pointer |
constポインタ型 const value_type* |
C++17 |
reference |
参照型 value_type& |
C++17 |
const_reference |
const参照型 const value& |
C++17 |
const_iterator |
読み取り専用イテレータ。実装定義。 要素の型はvalue_type。 ランダムアクセスイテレータと連続イテレータの要件を満たす |
C++17 |
iterator |
イテレータ const_iterator |
C++17 |
const_reverse_iterator |
読み取り専用逆イテレータ reverse_iterator<const_iterator> |
C++17 |
reverse_iterator |
逆順イテレータ const_reverse_iterator |
C++17 |
size_type |
要素数を表す符号なし整数型 size_t |
C++17 |
difference_type |
イテレータの差を表す符号付き整数型 ptrdiff_t |
C++17 |
| 名前 |
説明 |
対応バージョン |
sv |
basic_string_viewのリテラル |
C++17 |
| 名前 |
説明 |
対応バージョン |
template <class T> struct hash; |
hashクラスの先行宣言 |
C++17 |
template <> struct hash<string_view>; |
hashクラスのstring_viewに対する特殊化 |
C++17 |
template <> struct hash<wstring_view>; |
hashクラスのwstring_viewに対する特殊化 |
C++17 |
template <> struct hash<u16string_view>; |
hashクラスのu16string_viewに対する特殊化 |
C++17 |
template <> struct hash<u32string_view>; |
hashクラスのu32string_viewに対する特殊化 |
C++17 |
#include <iostream>
#include <string_view>
int main()
{
// 文字列リテラルから部分文字列を取得する。
// その際、メモリアロケートは発生しない
std::cout << std::string_view("Hello World").substr(0, 5) << std::endl;
// 文字列リテラル内から特定の文字列を検索する。
// この例でも、メモリアロケートや文字列オブジェクトのコピーなどは発生しない
std::string_view sv = "Hello World";
std::size_t pos = sv.find("rl");
if (pos != std::string_view::npos) {
std::cout << "found" << std::endl;
}
}
- std::string_view[color ff0000]
- substr[link basic_string_view/substr.md]
- sv.find[link basic_string_view/find.md.nolink]