在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中是否支持这种事情?
答案 0 :(得分:7)
为std::pair
执行此操作的问题在于,它“适用于”许多无效范围的事情。从而造成错误。
C ++ 11没有为此提供内置解决方案。您可以使用Boost.Range's make_iterator_range
facility to build one easily。再说一次,手动操作并不困难:
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);}
答案 1 :(得分:0)
您仍然可以使用一对迭代器来指定要迭代的序列。语句for(a: c)
实质上是遍历序列[begin(c), end(c))
。因此,您只需使用match_results
对象或提供返回正则表达式迭代器类型之一的合适begin
和end
函数。