कोई वहाँ दुर्भाग्य से ऐसी कोई बात नहीं है। सबसे नज़दीकी बात 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&) { }
यह आपके समाधान के रूप में लगभग समान प्रदर्शन है, लेकिन यह अधिक व्यापक रूप से प्रयोग योग्य है।
आपने अभी एक बनाया है। आपका प्रश्न क्या है? –
शायद आप सी ++ 11 ['std :: copy_if'] (http://en.cppreference.com/w/cpp/algorithm/copy) फ़ंक्शन का उपयोग कर सकते हैं? –
'partial_sort_copy' का हैक किया गया संस्करण हो सकता है? हालांकि मैं स्पष्ट रूप से इसे जटिल करने के बिंदु को नहीं देखता हूं ... – Nim