C++11正则表达式标记迭代器

5

嗯...我以为我理解了正则表达式,也以为我理解了迭代器,但是C++11的正则表达式实现却让我感到困惑...

有一个领域我不理解:阅读关于regex token iterators的内容,我看到了下面这个样例代码:

#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>
int main()
{
   std::string text = "Quick brown fox.";
   // tokenization (non-matched fragments)
   // Note that regex is matched only two times: when the third value is obtained
   // the iterator is a suffix iterator.
   std::regex ws_re("\\s+"); // whitespace
   std::copy( std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
   ...
}

我不理解以下输出的含义:
Quick
brown
fox.

上面的std::copy()函数正在创建。我没有看到循环,所以我不知道迭代是如何发生的。换句话说,多行输出是如何生成的?


它将每个内容复制到输出中。循环在“copy”内部。 - chris
1个回答

4

std::copy是一个函数,它可以将输入范围内的元素复制到输出范围中。在您的程序中,输入范围是使用正则表达式分隔符提取的三个标记。这些是打印到输出的三个单词。输出范围是ostream_iterator,它只需要接受每个元素并将该元素写入输出流。

如果您使用调试器逐步执行std::copy,您会看到它遍历输入范围的元素。


啊,我没想到尝试过那个方法,我一直以为std::copy()只是从起始迭代器到结束迭代器进行简单的字节级复制。谢谢,詹姆斯。 - U007D
不是的,std::copy 是标准库算法之一(通常称为 STL 的一部分),它像其他算法一样操作元素范围。在这种情况下,元素是令牌。 - James McNellis
从开始到结束的字节级复制不会按迭代器的方式进行,这样做没有任何意义。 - Cubic
也许澄清我的误解会对其他人有所裨益...我曾(错误地)假设std:copy是通过text.begin()到text.end()迭代遍历单个字符。我期望的是一个长字符串(“Quick brown fox”),或者只是第一个标记(“Quick”)。事实上,1)迭代器将标记本身视为要迭代的实体(而不是单个字符),2)std::copy在集合上推进迭代器,这些都是对我的启示。 - U007D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接