2012-07-19 13 views
6

के साथ कॉपी-जैसे एल्गोरिदम क्या std::copy-एल्गोरिदम की तरह है जो चार श्रेणियों को स्वीकार करता है, जो दो श्रेणियों को दर्शाता है?चार इटरेटर्स

मूल रूप से, यह जैसे ही या तो सीमा समाप्त हो रहा है को कॉपी बंद कर देना चाहिए:

template<typename Iter> 
void copy_range(Iter begin1, Iter end1, Iter begin2, Iter end2) 
{ 
    for (; (begin1 != end1) && (begin2 != end2); ++begin1, ++begin2) 
    { 
     *begin2 = *begin1; 
    } 
} 
+2

आपने अभी एक बनाया है। आपका प्रश्न क्या है? –

+0

शायद आप सी ++ 11 ['std :: copy_if'] (http://en.cppreference.com/w/cpp/algorithm/copy) फ़ंक्शन का उपयोग कर सकते हैं? –

+0

'partial_sort_copy' का हैक किया गया संस्करण हो सकता है? हालांकि मैं स्पष्ट रूप से इसे जटिल करने के बिंदु को नहीं देखता हूं ... – Nim

उत्तर

10

कोई वहाँ दुर्भाग्य से ऐसी कोई बात नहीं है। सबसे नज़दीकी बात std::copy_n है।

और निश्चित रूप से आपके द्वारा अभी लिखा गया एल्गोरिदम।

इस्तेमाल किया इटरेटर के प्रकार (यादृच्छिक या नहीं) पर निर्भर करता है

, का उपयोग करते हुए इस और अधिक कुशल है अपने एल्गोरिथ्म से (क्योंकि केवल एक चेक प्रत्येक यात्रा के लिए किए जाने की जरूरत है):

std::copy_n(begin1, 
      std::min(std::distance(begin1, end1), std::distance(begin2, end2)), 
      begin2); 

एक और

template<class Iter> 
class CheckedOutputIter { 
public: 
    // exception used for breaking loops 
    class Sentinel { } 

    CheckedOutputIter() 
     : begin(), end() { } 

    CheckedOutputIter(Iter begin, Iter end) 
     : begin(begin), end(end) { } 

    CheckedOutputIter& operator++() { 
     // increment pas end? 
     if (begin == end) { 
      throw Sentinel(); 
     } 

     ++begin; 
     return *this; 
    } 

    CheckedOutputIter operator++(int) { 
     // increment past end? 
     if (begin == end) { 
      throw Sentinel(); 
     } 

     CheckedOutputIter tmp(*this); 

     ++begin; 

     return tmp; 
    } 

    typename iterator_traits<Iter>::value_type operator*() { 
     return *begin; 
    } 


private: 
    Iter begin, end; 
}; 

उपयोग::

0 विकल्प एक जाँच की उत्पादन iterator, इस की तर्ज (स्केच, नहीं जाँच कोड) के साथ कुछ है
try { 
    std::copy(begin1, end1, CheckedOutputIter(begin2, end2)); 
} catch(const CheckedOutputIter::Sentinel&) { } 

यह आपके समाधान के रूप में लगभग समान प्रदर्शन है, लेकिन यह अधिक व्यापक रूप से प्रयोग योग्य है।

संबंधित मुद्दे