C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++ STL】match_results::cbegin() と cend() の使い方を徹底解説

はじめに

本記事では、C++ STLにおける match_results::cbegin() および match_results::cend() 関数の動作、構文、具体的な使用例について詳しく解説します。正規表現によるマッチ結果を安全に走査したい場合に役立つ内容となっていますので、ぜひ参考にしてください。

C++ STLにおけるmatch_resultsとは?

std::match_results は、正規表現(regex)によるマッチ操作の結果として得られた文字列シーケンスのコレクションを格納するための、コンテナのような特殊なクラステンプレートです。このコンテナには、ターゲットシーケンス(検索対象の文字列)に対して正規表現マッチを実行した際に見つかった一致箇所が保持されます。

match_results::cbegin()とは?

match_results::cbegin() は、C++ STLに組み込まれた関数であり、<regex> ヘッダーファイルで定義されています。この関数は、match_results コンテナの最初の要素を指す定数イテレータを返します。

定数イテレータは、コンテナ内の要素を変更する目的では使用できません。読み取り専用としてコンテナを先頭から順に走査する場合に用いられる点が特徴です。

構文

smatch_name.cbegin();

パラメータ

この関数は引数(パラメータ)を受け取りません。

戻り値

match_results コンテナの最初の要素を指す定数イテレータを返します。

入力例と出力イメージ

Input: std::string str("TutorialsPoint");
    std::smatch Mat;
    std::regex re("(Tutorials)(.*)");
    std::regex_match ( str, Mat, re );
    Mat.cbegin();
Output: T
cbegin()

サンプルコード

#include <iostream>
#include <string>
#include <regex>
int main () {
    std::string str("Tutorials");
    std::smatch Mat;
    std::regex re("(Tuto)(.*)");
    std::regex_match ( str, Mat, re );
    std::cout<<"Match Found: " << std::endl;
    for (std::smatch::iterator i = Mat.cbegin(); i!= Mat.cend(); ++i) {
       std::cout << *i << std::endl;
    }
    return 0;
}

実行結果

上記のコードを実行すると、以下の出力が得られます。

Match Found
Tutorials
Tuto
rials

match_results::cend()とは?

match_results::cend() もまた、C++ STLに組み込まれた関数で、<regex> ヘッダーファイルで定義されています。この関数は、match_results コンテナの最後の要素の次の位置(終端の1つ後ろ)を指す定数イテレータを返します。

動作自体は match_results::end() 関数と同じですが、こちらは変更不可の定数イテレータを返す点が異なります。

構文

smatch_name.cend();

パラメータ

この関数は引数(パラメータ)を受け取りません。

戻り値

match_results コンテナの末尾要素の次の位置(past-the-end)を指す定数イテレータを返します。

入力例と出力イメージ

Input: std::string str("TutorialsPoint");
    std::smatch Mat;
    std::regex re("(Tutorials)(.*)");
    std::regex_match ( str, Mat, re );
    Mat.cend();
Output: m //random value which is past to last.
cend()

サンプルコード

#include <iostream>
#include <string>
#include <regex>
int main () {
    std::string str("Tutorials");
    std::smatch Mat;
    std::regex re("(Tuto)(.*)");
    std::regex_match ( str, Mat, re );
    std::cout<<"Match Found: " << std::endl;
    for (std::smatch::iterator i = Mat.cbegin(); i!= Mat.cend(); ++i) {
       std::cout << *i << std::endl;
    }
    return 0;
}

実行結果

上記のコードを実行すると、以下の出力が得られます。

Match Found
Tutorials
Tuto
rials

まとめ

cbegin()cend() を組み合わせることで、正規表現のマッチ結果である match_results コンテナを、要素の意図しない変更を防ぎながら安全に走査できます。範囲ベースの for 文や通常のイテレータループと同様に、「先頭から終端まで」を表す基本的なペアとして覚えておくと良いでしょう。

  1. C++で連結リストの2つの数を加算する方法(Add Two Numbers II)

    問題の概要2つの空でない連結リストが与えられ、それぞれが非負の整数を表しているとします。最上位の桁がリストの先頭に配置されており、各ノードには1桁の数字が格納されています。この2つの数を加算し、その結果を連結リストとして返す必要があります。例えば、リスト [7, 2, 4, 3] と [5, 6, 4] を加算すると、結果は [7, 8, 0, 7] になります。解法のアプローチ最上位の桁が先頭にあるため、下位の桁から順に足し算を行う必要があります。しかし、連結リストは後方のノードへ直接アクセスするのが苦手です。そこで、スタックのLIFO(後入れ先出し)の性質を活用します。各リストのノードをあ

  2. C++ STLのスタック(stack)徹底解説!LIFO構造の基本操作とサンプルコード

    C++ STLにおけるスタック(stack)は、LIFO(Last In First Out:後入れ先出し)構造として実装されるコンテナです。LIFOとは「最後に入れたものが最初に取り出される」という意味で、本を一冊ずつ積み上げた山をイメージすると理解しやすいでしょう。一番上に置いた本(=最後に挿入された要素)が最初に取り出されることから、この構造はLIFOと呼ばれています。 スタックで使える主な操作 1. top() – 最上位要素の取得 スタックの最上位(先頭)にある要素への参照を返します。要素自体は削除されません。 構文:name_of_stack.top() 引数:なし 戻り値:ス