आपको मूल रूप से output iterator
लिखने की आवश्यकता होगी। यह एक सा बदसूरत है, लेकिन कुछ इस तरह चाल करना चाहिए:
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
template <typename ContainerOfContainer, typename Container, std::size_t n>
struct nested_back_inserter : public std::iterator<std::output_iterator_tag, void,
void, void, void>
{
std::size_t k;
std::size_t current_;
ContainerOfContainer* container_;
explicit nested_back_inserter(ContainerOfContainer& cont)
: k(0), current_(0), container_(&cont)
{ }
nested_back_inserter& operator=(typename Container::value_type value)
{
if(k == n) {
++current_;
k = 0;
}
(*container_)[current_].push_back(value);
++k;
return *this;
}
nested_back_inserter& operator*()
{
return *this;
}
nested_back_inserter& operator++()
{
return *this;
}
nested_back_inserter& operator++(int)
{
return *this;
}
};
int main()
{
int arr[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
std::vector<std::vector<int>> v;
for(unsigned i = 0; i < 3; ++i) {
std::vector<int> vi;
v.push_back(vi);
}
typedef std::vector<std::vector<int>> nested;
typedef std::vector<int> cont;
std::copy(arr[0], arr[2] + 3, nested_back_inserter<nested, cont, 3>(v));
for(auto it = v.begin(); it != v.end(); ++it) {
std::cout << "{";
for(auto it2 = it->begin(); it2 != it->end(); ++it2) {
std::cout << *it2 << ", ";
}
std::cout << "}\n";
}
return 0;
}
नोट std::copy(arr[0], arr[2] + 3, ...);
में विशेष रूप से uglyness।
थकावट के कारण, मैं किसी भी एक-एक-एक त्रुटि या अन्य विषमता के लिए कोई जिम्मेदारी नहीं लेता जो इसके साथ हो सकता है। यह आपको इस तरह के कुछ को कार्यान्वित करने का विचार देना चाहिए।
धन्यवाद, यह निष्पक्ष रूप से काम करता है। –
आप डीवीक्टर को कैसे मुद्रित करेंगे? – chefarov
@chefarov सरल विधि loops के लिए घोंसला जा सकता है, या शायद 'vector_wrapper' के लिए आउटपुट ऑपरेटर को परिभाषित कर सकता है और फिर बाहरीतम' वेक्टर 'मुद्रित कर सकता है। –