4

C ++ 11の最終ドラフトでは、範囲ベースのforループで、イテレーターのペアを介して反復する範囲を指定できます。これにより、正規表現のすべての一致を簡単に繰り返すことができました。イテレータのペアを使用して範囲を指定する機能は後で削除され、C++11には存在しません。特定の正規表現のすべての一致を反復処理する簡単な方法はまだありますか?私はこのようなことをしたいと思っています:

std::regex begin(" 1?2?3?4* ");
std::regex end;

for(auto& match: std::pair(begin, end)) process(*match);

C ++ 11でこの種のサポートはありますか?

4

2 に答える 2

8

それを行う際の問題std::pairは、有効な範囲ではない多くのもので「機能する」ことです。したがって、エラーが発生します。

C ++ 11には、このための組み込みソリューションは付属していません。Boost.Rangeのmake_iterator_range機能を使用して、簡単に作成できます。繰り返しになりますが、手動で行うことはそれほど難しくありません。

template<typename T>
class IterRange
{
  T start;
  T end;
public:
  IterRange(const T &start_, const T &end_) : start(start_), end(end_) {}

  T begin() {return start;}
  T end() {return end;}
};

template<typename T> IterRange<T> make_range(const T &start, const T &end) {return IterRange<T>(start, end);}
于 2012-10-11T04:19:39.020 に答える
0

反復子のペアを使用して、反復するシーケンスを指定することもできます。ステートメントfor(a: c)は、本質的にシーケンスを繰り返します[begin(c), end(c))。したがって、オブジェクトを使用するか、正規表現イテレータ型の 1 つを返すmatch_results適切なbeginand関数を提供するだけで済みます。end

于 2012-10-11T11:27:32.930 に答える