最終更新日時:
が更新

履歴 編集

function
<regex>

std::regex_token_iterator::operator=(C++11)

regex_token_iterator& operator=(const regex_token_iterator& rhs);

概要

rhs*this にコピーする。

効果

rhs の状態を *this にコピーする。

戻り値

*this

備考

規格書には特に記載は無いが、前方向イテレータの要件から、コピー元オブジェクトの全ての状態を引き継ぐと考えてよいものと思われる。

#include <iostream>
#include <iterator>
#include <regex>
#include <string>
#include <initializer_list>

int main()
{
  const std::string s("enum E { enumerator1 = value1, enumerator2 = value2, enumerator3 = value3, };");
  const std::regex re(R"((\w+)\s*=\s*(\w+))"); // 列挙子とその値をグループ化

  std::sregex_token_iterator it1;
  // 1 番目と 2 番目のサブマッチを順に繰り返す
  for (std::sregex_token_iterator it2(std::begin(s), std::end(s), re, { 1, 2 }), end; it2 != end; ++it2) {
    // it2 が value2 を指した時点で、it1 にコピーする
    if (*it2 == "value2") {
      it1 = it2;
    }
    std::cout << "match range = (" << it2->first - std::begin(s) << ", " << it2->second - std::begin(s) << "), "
                 "str = '" << it2->str() << '\'' << std::endl;
  }
  std::cout << std::endl;

  // it2 を途中でコピーしたイテレータで、1 番目と 2 番目のサブマッチを順に繰り返す
  for (std::sregex_token_iterator end; it1 != end; ++it1) {
    std::cout << "match range = (" << it1->first - std::begin(s) << ", " << it1->second - std::begin(s) << "), "
                 "str = '" << it1->str() << '\'' << std::endl;
  }
}

出力

match range = (9, 20), str = 'enumerator1'
match range = (23, 29), str = 'value1'
match range = (31, 42), str = 'enumerator2'
match range = (45, 51), str = 'value2'
match range = (53, 64), str = 'enumerator3'
match range = (67, 73), str = 'value3'

match range = (45, 51), str = 'value2'
match range = (53, 64), str = 'enumerator3'
match range = (67, 73), str = 'value3'

バージョン

言語

  • C++11

処理系

備考

GCC & libstdc++ では、コピー直後のオブジェクトの参照先が誤っている。

参照

名前 説明 対応バージョン
(constructor) コンストラクタ C++11
operator== 等値比較 C++11
operator++ インクリメント C++11