【C++20】views::splitで文字列を指定した区切り文字で分割する方法

目次

はじめに

C++で、「A,B,C」のようなカンマ区切りの文字列を、個々の要素「A」「B」「C」に分割したい、という場面は非常に頻繁にあります。

従来はstd::getlinestd::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 を使った従来の手動での文字列分割の複雑さを解消し、コードを劇的にシンプルにしてくれます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次