2012-08-28 9 views
5

हम्म ... मैंने सोचा कि मैं regexes समझ गई और मैंने सोचा कि मैं iterators समझा, लेकिन सी ++ 11 की regex कार्यान्वयन मुझे हैरान किया है ...सी ++ 11 regex_token_iterator

एक क्षेत्र मुझे समझ नहीं आता: 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 :: प्रतिलिपि द्वारा बनाई जा रही है कार्यात्मक ऊपर एन मुझे कोई लूप नहीं दिख रहा है, इसलिए मैं परेशान हूं कि पुनरावृत्ति कैसा चल रहा है। या एक और तरीका रखो, उत्पादन की एक से अधिक पंक्ति कैसे उत्पन्न की जा रही है?

+0

यह प्रत्येक आउटपुट में प्रतिलिपि बनाता है। लूप 'प्रतिलिपि' के अंदर है। – chris

उत्तर

4

std::copy एक इनपुट रेंज से आउटपुट रेंज में तत्वों की प्रतिलिपि बनाता है। आपके प्रोग्राम में, इनपुट रेंज नियमित अभिव्यक्ति डेलीमीटर का उपयोग करके निकाले गए तीन टोकन हैं। ये तीन शब्द हैं जो आउटपुट में मुद्रित होते हैं। आउटपुट रेंज ostream_iterator है जो इसे प्रत्येक तत्व को देता है और इसे आउटपुट स्ट्रीम में तत्व लिखता है।

यदि आप अपने डीबगर का उपयोग करके std::copy से आगे बढ़ते हैं, तो आप देखेंगे कि यह इनपुट रेंज के तत्वों पर लूप करता है।

+0

आह - मैंने यह कोशिश करने के लिए नहीं सोचा था - मुझे लगता है कि std :: copy() प्रारंभ iterator से अंत iterator तक एक साधारण बाइट-स्तरीय प्रति थी। धन्यवाद, जेम्स। – U007D

+0

नहीं, 'std :: copy' मानक लाइब्रेरी एल्गोरिदम (जिसे आमतौर पर _STL_ कहा जाता है) का हिस्सा है, और यह शेष एल्गोरिदम की तरह तत्वों की श्रेणियों पर चलता है। इस मामले में, तत्व टोकन हैं। –

+0

अब सही समझ में आता है। – U007D