Skip to content

Instantly share code, notes, and snippets.

@eugesh
Last active May 30, 2025 14:02
Show Gist options
  • Select an option

  • Save eugesh/7bacfddb1825c70ae51d8870b3a7cab2 to your computer and use it in GitHub Desktop.

Select an option

Save eugesh/7bacfddb1825c70ae51d8870b3a7cab2 to your computer and use it in GitHub Desktop.
C++ custom container with reverse iterator example
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <iterator>
struct someStruct {
double m_d;
int m_i;
};
template<typename T> //, class _Alloc = allocator<T> >
class list2 {
public:
std::vector<T> _data;
using value_type = T;
using reference = T&;
using const_reference = const T&;
using iterator = T*;
using const_iterator = const T*;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
list2(const list2<T> &l) { _data = l._data; }
list2(std::initializer_list<T> l) {
for (const auto &elem : l)
_data.push_back(elem);
}
void push_back(const T& elem) { _data.push_back(elem); }
~list2() { _data.clear(); }
reverse_iterator rbegin() {
return reverse_iterator(end());
}
const_reverse_iterator crbegin() const {
return const_reverse_iterator(cend());
}
reverse_iterator rend() {
return reverse_iterator(begin());
}
const_reverse_iterator crend() const {
return const_reverse_iterator(cbegin());
}
iterator begin() { return _data.data(); }
const_iterator cbegin() const { return _data.data(); }
iterator end() { return _data.data() + _data.size(); }
const_iterator cend() const { return _data.data() + _data.size(); }
};
// -------------------------------------------------------------------
// --- Reversed iterable
template <typename T>
struct reversion_wrapper { T& iterable; };
template <typename T>
auto begin (reversion_wrapper<T> w) { return std::rbegin(w.iterable); }
template <typename T>
auto end (reversion_wrapper<T> w) { return std::rend(w.iterable); }
template <typename T>
reversion_wrapper<T> reverse (T&& iterable) { return { iterable }; }
int main ()
{
list2<double> lst_vec{1.1, 1, 2.2, 2};
list2<someStruct> lst{{1.1, 1}, {2.2, 2}, {3.3, 3}};
std::vector<double> vect{1.1, 1, 2.2, 2};
for (auto num : reverse(lst_vec)) {
std::cout << num << " ";
}
std::cout << "\n";
for (auto num : lst) {
std::cout << num.m_d << " " << num.m_i << " ";
}
std::cout << "\n";
for (auto num : reverse(lst)) {
std::cout << num.m_d << " " << num.m_i << " ";
}
std::cout << "\n";
for (auto num : reverse(vect)) {
std::cout << num << " ";
}
std::cout << "\n";
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment