はじめに
C++で、「A,B,C
」のようなカンマ区切りの文字列を、個々の要素「A
」「B
」「C
」に分割したい、という場面は非常に頻繁にあります。
従来はstd::getline
とstd::stringstream
を組み合わせるなどの手動での処理が必要でしたが、C++20のRangesライブラリで導入された**std::views::split
**を使えば、この処理を非常に直感的かつ簡潔に記述できます。
split
は、元の文字列を指定した区切り文字で分割した、部分文字列の集まり(ビュー)を生成します。
【前提】C++20とは?
C++20は、2020年に正式化されたC++言語のメジャーアップデート版です。RangesライブラリはこのC++20で導入された主要機能のため、利用するにはC++20に対応したコンパイラが必要です。
views::split
を使ったサンプルコード
このコードは、スペース()で区切られた文字列を、views::split
を使って単語ごとに分割し、出力します。
完成コード
#include <iostream>
#include <string>
#include <string_view> // string_view
#include <ranges>
namespace views = std::ranges::views;
using namespace std;
int main() {
string_view sentence = "C++ Ranges are powerful";
cout << "元の文字列: \"" << sentence << "\"" << endl;
cout << "分割結果:" << endl;
// 1. splitビューを作成
// スペース(' ')を区切り文字として文字列を分割するビュー
for (const auto& word_range : sentence | views::split(' ')) {
// 2. 分割された部分範囲(subrange)をstring_viewに変換して出力
cout << string_view{word_range} << endl;
}
return 0;
}
実行結果
元の文字列: "C++ Ranges are powerful"
分割結果:
C++
Ranges
are
powerful
コードの解説
for (const auto& word_range : sentence | views::split(' '))
views::split(' ')
: 引数として渡された区切り文字または区切り文字列(この場合はスペース文字' '
)を基準に、元の範囲 (sentence
) を分割するビューを作成します。word_range
:split
が返すのは、文字列そのものではなく、元の文字列の一部分を指す**部分範囲(subrange)**です。
cout << string_view{word_range} << endl;
split
が返す部分範囲(word_range
)は、そのままでは cout
で直接出力できません。string_view{word_range}
のように、std::string_view
に変換することで、その部分文字列を画面に出力できるようになります。
まとめ
今回は、C++20のstd::views::split
を使って、文字列を区切り文字で分割する方法を解説しました。
文字列 | views::split(区切り文字)
の構文で、分割されたビューを作成する。- 範囲
for
文でループ処理し、各部分範囲を**std::string_view
などに変換**して利用する。
split
は、for
ループや stringstream
を使った従来の手動での文字列分割の複雑さを解消し、コードを劇的にシンプルにしてくれます。