मैं इटरेटर और जेनेरिक फ़ंक्शंस पर बेहतर पकड़ पाने की कोशिश कर रहा हूं। मैंने सोचा कि यह एक ऐसा फ़ंक्शन लिखने के लिए उपयोगी अभ्यास होगा जो container1 < container2 <type> >
को container3 <type>
में परिवर्तित करता है। उदाहरण के लिए, यह vector< deque<int> >
को list<int>
में परिवर्तित करने में सक्षम होना चाहिए।कंटेनर के कंटेनर को फ़्लैट करने के लिए जेनेरिक फ़ंक्शन
मुझे लगा कि सभी कंटेनर एक्सेस इटरेटर के माध्यम से होनी चाहिए, जैसे <algorithm>
में फ़ंक्शंस।
यहाँ मेरी कोड है:,
int main()
{
using namespace std;
vector< vector<string> > splitlines;
vector<string> flat;
/* some code to fill SPLITLINES with vectors of strings */
flatten(splitlines.begin(), splitlines.end(), back_inserter(flat));
}
मैं एक बड़ी सी ++ टेम्पलेट त्रुटि संदेश मिलता है undefined reference to void flatten< ... pages of templates ...
मैं:
#include <iterator>
#include <algorithm>
// COCiter == Container of Containers Iterator
// Oiter == Output Iterator
template <class COCiter, class Oiter>
void flatten (COCiter start, COCiter end, Oiter dest)
{
using namespace std;
while (start != end) {
dest = copy(start->begin(), start()->end(), dest);
++start;
}
}
लेकिन जब मैं निम्नलिखित कोड में इसे कहते हैं की कोशिश ऐसा लगता है कि मेरे कोड को लिखना बहुत आसान था, और मुझे यह सुनिश्चित करने के लिए कुछ और चीजों की आवश्यकता होगी कि आंतरिक कंटेनर में डेटा प्रकार आउटपुट कंटेनर में डेटा प्रकार से मेल खाता हो। लेकिन मुझे नहीं पता कि क्या करना है।
ध्यान दें कि स्टैक में इटरेटर नहीं हैं, और कोई प्रारंभ/अंत कार्य नहीं है। यदि आप इसे ढेर के साथ काम करना चाहते हैं, तो आपको निश्चित रूप से विशेष मामले में जाना होगा। –
यह सच है; मैं सवाल बदल दूंगा। मुझे वास्तव में ढेर compatibiliy की जरूरत नहीं है; बस पुनरावर्तनीय कंटेनर। – japreiss