Advertisement
kenpusney

merged_container_iterator_adapter

Feb 8th, 2023
1,026
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <set>
  4.  
  5. using namespace std;
  6.  
  7. template<class Container>
  8. struct merged_container_iterator_adapter {
  9.     using container_iterator = typename Container::iterator;
  10.     using value_type = typename container_iterator::value_type;
  11.  
  12.     struct iterator {
  13.         merged_container_iterator_adapter<Container>* self;
  14.         std::size_t index;
  15.         container_iterator iter;
  16.  
  17.         const value_type& operator*() {
  18.             return *iter;
  19.         }
  20.  
  21.         iterator& operator++() {
  22.             self->next(*this);
  23.             return *this;
  24.         }        
  25.         bool operator!=(iterator other) {
  26.             return this->iter != other.iter || this->index != other.index;
  27.         }
  28.     };
  29.  
  30.     vector<Container*> container_refs;
  31.  
  32.  
  33.     merged_container_iterator_adapter(vector<Container*>&& containers): container_refs(containers) {}
  34.  
  35.     iterator begin() {
  36.         return iterator {this, 0, (*container_refs.begin())->begin()};
  37.     }
  38.  
  39.     iterator end() {
  40.         return iterator {this, container_refs.size() - 1, (*(--container_refs.end()))->end()};
  41.     }
  42.  
  43.     void next(iterator& it) {
  44.         container_iterator next = ++(it.iter);
  45.         size_t index = it.index;
  46.         if (next != container_refs[index]->end() || index == container_refs.size() - 1) {
  47.             it.iter = next;
  48.         } else {
  49.             ++index;
  50.             it.index = index;
  51.             it.iter = container_refs[index]->begin();
  52.         }
  53.     }
  54. };
  55.  
  56. int main() {
  57.     vector vec1 {1, 2, 3};
  58.     vector vec2 {4, 5, 6};
  59.     vector vec3 {7, 8, 9};
  60.  
  61.     merged_container_iterator_adapter merged {vector{&vec1, &vec2, &vec3}};
  62.  
  63.     for (auto&& x: merged) {
  64.         cout<< x << endl;
  65.     }
  66.  
  67.     set set1 {1, 2, 3};
  68.     set set2 {4, 5, 6};
  69.  
  70.     merged_container_iterator_adapter merged_set {vector{&set1, &set2}};
  71.  
  72.     for (auto&& elem: merged_set) {
  73.         cout<< elem << endl;
  74.     }
  75. }
  76.  
Advertisement
Comments
  • Olive606563
    1 year (edited)
    # text 0.30 KB | 0 0
    1. We have provided information like salon prices and different related memberships, gift cards, salon hours etc. in our website which you can use, the prices given here are taken from the official website and given to you by our team. will come which you can see
    2.  
    3. Our Website:- https://salonpricelist.com
  • Olive606563
    1 year
    # text 0.56 KB | 0 0
    1. The 'std::reverse_iterator' adaptor iterates elements in the reverse direction. A reverse iterator is based on a biderctional iterator (LegacyBidirectionalIterator). After incrementing, it points to the previous container element.
    2.  
    3. Each container, which allows a reverse iteration through the elements, already has non-static member functions that return reverse iterators to the beginning and to the end — 'rbegin()' and 'rend()'. A program, which implements a reverse iteration through the elements, may look like this:
    4. visit our website :- https://salonpricelist.com
Add Comment
Please, Sign In to add comment
Advertisement