मुझे लगता है कि आप auto
और नई रेंज आधारित for
पाश का उपयोग करना चाहते।
आप vector_view
बना सकते हैं और आंतरिक लूप में "उप वेक्टर" पर फिर से बना सकते हैं।
यहाँ आप आरंभ करने के लिए एक सरल उदाहरण (auto&
के उपयोग के नोटिस और नहीं auto
) है:
Run It Online
#include <iostream>
#include <cstddef>
#include <numeric>
#include <vector>
using std::cout;
using std::endl;
template <typename T, typename A>
struct vector_view
{
using vector_type = std::vector<T, A>;
using const_iterator = typename vector_type::const_iterator;
using iterator = typename vector_type::iterator;
vector_type& vec;
size_t _begin;
size_t _length;
vector_view(vector_type& v, size_t begin_, size_t length_)
: vec(v), _begin(begin_), _length(length_) {}
const_iterator begin() const { return vec.begin() + _begin; }
iterator begin() { return vec.begin() + _begin; }
const_iterator end() const { return vec.begin() + _begin + _length; }
iterator end() { return vec.begin() + _begin + _length; }
};
int main()
{
std::vector<int> v(10);
std::iota(v.begin(), v.end(), 0);
for (auto& it : v)
{
size_t begin = std::distance(&v[0], &it) + 1;
size_t length = v.size() - begin;
vector_view<typename decltype(v)::value_type,
typename decltype(v)::allocator_type
> vv(v, begin, length);
cout << it << ": ";
for (auto& jt : vv)
{
cout << jt << " ";
}
cout << endl;
}
}
आउटपुट:
0: 1 2 3 4 5 6 7 8 9
1: 2 3 4 5 6 7 8 9
2: 3 4 5 6 7 8 9
3: 4 5 6 7 8 9
4: 5 6 7 8 9
5: 6 7 8 9
6: 7 8 9
7: 8 9
8: 9
9:
संपादित: आप वाक्य बना सकते हैं कुल्हाड़ी यदि आप एक make_vector_view()
समारोह को परिभाषित कम वर्बोज़:
template <typename T, typename A>
vector_view<T, A> make_vector_view(std::vector<T, A>& v,
size_t begin_,
size_t length_)
{
return {v, begin_, length_};
}
और टेम्पलेट तर्क प्रकार कटौती करने के लिए धन्यवाद, आप लिख सकते हैं:
Run It Online
for (auto& it : v)
{
size_t begin = std::distance(&v[0], &it) + 1;
size_t length = v.size() - begin;
cout << it << ": ";
for (auto& jt : make_vector_view(v, begin, length))
{
cout << jt << " ";
}
cout << endl;
}
यह वास्तव में स्पष्ट नहीं आप क्या होने की उम्मीद है। क्या आप एक * अच्छा * (पूरा!) उदाहरण दे सकते हैं? –