2012-08-28 36 views
5

Hmm ... creí comprender expresiones regulares, y yo pensaba que entendía iteradores, pero de C++ 11 Ejecución de expresiones regulares me ha intrigado ...C++ 11 regex_token_iterator

Una de las áreas que no entiendo: la lectura sobre regex token iterators, me encontré con el siguiente código de ejemplo:

#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")); 
    ... 
} 

no entiendo cómo el siguiente resultado:

Quick 
brown 
fox. 

está siendo creado por el std :: copy() funcio n arriba. No veo ningún bucle, así que estoy desconcertado por la forma en que se está produciendo la iteración. O dicho de otra manera, ¿cómo se genera más de una línea de salida?

+0

Copia cada uno a la salida. El bucle está dentro de 'copy'. – chris

Respuesta

4

std::copy copia elementos de un rango de entrada en un rango de salida. En su programa, el rango de entrada son los tres tokens extraídos usando el delimitador de expresión regular. Estas son las tres palabras que se imprimen en la salida. El rango de salida es ostream_iterator que simplemente toma cada elemento que se le da y escribe el elemento en una secuencia de salida.

Si pasa por std::copy usando su depurador, verá que pasa por encima de los elementos del rango de entrada.

+0

Ah - No pensé en probar eso - Supuse que std :: copy() era una copia de nivel de bytes simple desde el iterador de inicio hasta el iterador final. Gracias, James. – U007D

+0

No, 'std :: copy' es uno de los algoritmos de la Biblioteca estándar (parte de lo que comúnmente se conoce como _STL_), y opera en rangos de elementos, al igual que el resto de los algoritmos. En este caso, los elementos son los tokens. –

+0

Tiene perfecto sentido ahora. – U007D