2012-08-28 17 views
5

Hmm ... Credevo di aver capito regex, e ho pensato ho capito iteratori, ma l'attuazione regex C++ 11 di me ha lasciato perplessi ...C++ 11 regex_token_iterator

Un settore che non capisco: leggere su regex token iterators, mi sono imbattuto nel seguente codice di esempio:

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

non capisco come il seguente output:

Quick 
brown 
fox. 

viene creato dal std :: copy() functio n sopra. Non vedo loop, quindi sono perplesso su come si sta verificando l'iterazione. In altre parole, come viene generato più di una riga di output?

+0

Copia ciascuno nell'output. Il ciclo è all'interno di 'copia'. – chris

risposta

4

std::copy copia elementi da un intervallo di input in un intervallo di uscita. Nel tuo programma, l'intervallo di input è i tre token estratti utilizzando il delimitatore di espressione regolare. Queste sono le tre parole che vengono stampate sull'output. L'intervallo di output è ostream_iterator che prende semplicemente ogni elemento assegnato e scrive l'elemento in un flusso di output.

Se si passa attraverso std::copy utilizzando il debugger, si vedrà che scorre su elementi dell'intervallo di input.

+0

Ah - Non pensavo di provarlo - pensavo che std :: copy() fosse una semplice copia a livello di byte dall'inizio iteratore all'endatore finale. Grazie, James. – U007D

+0

No, 'std :: copy' è uno degli algoritmi della libreria standard (parte di ciò che viene comunemente chiamato _STL_) e funziona su intervalli di elementi, proprio come il resto degli algoritmi. In questo caso, gli elementi sono i token. –

+0

Ha perfettamente senso ora. – U007D