अंतर यह है कि copy
एक रिटर्न है (यह एक द्विदिश इटरेटर से अधिक स्मृति की आवश्यकता) पास-द-एंड तत्व के लिए इटरेटर जबकि copy_backward
पहले तत्व में इटरेटर लौटाता है।
वे उस अर्थ के बराबर नहीं हैं।
- पाठ्यक्रम के हस्ताक्षर अलग-अलग हैं।
copy
InputIterator
एस और OutputIterator
के साथ ठीक है। जबकि copy_backward
BidirectionalIterator
एस की अपेक्षा करता है।
- कंटेनर पर प्रभाव (जब सही ढंग से उपयोग किया जाता है) वही है, लेकिन लौटाए गए इटरेटर विभिन्न प्रकार के होते हैं और विभिन्न तत्वों को इंगित करते हैं।
उदाहरण:
यह काम करता है क्योंकि vector
गुण InputIterator
, OutputIterator
और BidirectionalIterator
से उम्मीद का समर्थन करता है जो RandomAccessIterator
उपयोग कर सकते हैं।
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void printer(int i) {
cout << i << ", ";
}
int main() {
int mynumbers[] = {3, 9, 0, 2, 1, 4, 5};
vector<int> v1(mynumbers, mynumbers + 7);
vector<int>::iterator it = copy_backward(mynumbers, mynumbers + 7, v1.end());
for_each(v1.begin(), v1.end(), printer);
cout << endl << "Returned element: " << *it;
cout << endl;
vector<int>::reverse_iterator rit = copy(mynumbers, mynumbers + 7, v1.rbegin());
for_each(v1.begin(), v1.end(), printer);
cout << endl << "Before the first element (reverse end)? " << (rit == v1.rend());
rit--; // go to first element, because it is a reverse iterator
cout << endl << "Returned element: " << *rit;
return 0;
}
परिणाम:
3, 9, 0, 2, 1, 4, 5,
Returned element: 3
5, 4, 1, 2, 0, 9, 3,
Before the first element (reverse end)? 1
Returned element: 5
आप एक कंटेनर का समर्थन नहीं करता BidirectionalIterator
तो आप मुसीबत जोखिम का उपयोग करेंगे, तो (उदाहरण के लिए आप पीछे की ओर एक forward_list
कॉपी करने के लिए, क्योंकि यह एक ForwardIterator
का उपयोग करता है की कोशिश चाहते हैं, जो BidirectionalIterator
द्वारा प्रदान किए गए संचालन का समर्थन नहीं करता है)।
इस मामले में forward_list
पर रिवर्स इटरेटर के साथ प्रतिलिपि भी संभव नहीं है, क्योंकि यह रिवर्स इटरेटर्स का समर्थन नहीं करता है।
असल में, आपको यह सुनिश्चित करना होगा कि कंटेनर के इटरेटर समर्थित हैं और उस कंटेनर के अंत के अनुसार चुनें जिसे आप वापस करना चाहते हैं। अन्यथा प्रभाव वही है।
मुझे आश्चर्य नहीं होगा अगर, 'रिवर्स_इटरेटर' का उपयोग करते हुए, इटरेटर प्रकार को सही ढंग से टैग करने की आवश्यकता होती है जबकि 'copy_backward' को सरल लूप के रूप में कार्यान्वित किया जाता है। जाहिर है कि इसकी गारंटी नहीं है, यद्यपि। जहां तक मानक का संबंध है, सभी इटरेटर को टैग किया जाना चाहिए। –
हम्म ... एक ही पंक्तियों के साथ मूल पुनरावर्तक एक टी * के मामले में शायद धीमा हो सकता है? – hawk
'टी *' को एक यादृच्छिक-एक्सेस इटरेटर के रूप में टैग किया गया है, क्योंकि एक गारंटीकृत आंशिक विशेषज्ञता 'टेम्पलेट संरचना iterator_traits ; '। –