8 template <
typename T1,
typename T2>
class vector_pair {
12 std::vector<T1> m_first;
13 std::vector<T2> m_second;
16 vector_pair() : first(m_first), second(m_second)
26 void reserve(
size_t sz)
34 friend class vector_pair;
36 iterator(vector_pair &p,
size_t i) : m_parent(p), m_idx(i)
40 class vector_pair &m_parent;
49 bool operator!=(
const iterator &other)
const
51 return m_idx != other.m_idx;
54 std::pair<T1 &, T2 &> operator*()
56 return {m_parent.m_first.at(m_idx), m_parent.m_second.at(m_idx)};
60 class const_iterator {
61 friend class vector_pair;
63 const_iterator(
const vector_pair &p,
size_t i) : m_parent(p), m_idx(i)
67 const class vector_pair &m_parent;
76 bool operator!=(
const const_iterator &other)
const
78 return m_idx != other.m_idx;
81 std::pair<const T1 &, const T2 &> operator*()
83 return {m_parent.m_first.at(m_idx), m_parent.m_second.at(m_idx)};
89 return iterator(*
this, 0);
94 return iterator(*
this, m_first.size());
99 return const_iterator(*
this, 0);
104 return const_iterator(*
this, m_first.size());
108 template <
typename... Args1,
typename... Args2>
109 void emplace_back(std::tuple<Args1...> args1, std::tuple<Args2...> args2)
111 std::apply([
this](
auto &&... args) { m_first.emplace_back(args...); }, args1);
112 std::apply([
this](
auto &&... args) { m_second.emplace_back(args...); }, args2);
115 std::pair<T1 &, T2 &> atm(
size_t idx)
117 return {m_first.at(idx), m_second.at(idx)};
120 std::pair<const T1 &, const T2 &> at(
size_t idx)
const
122 return {m_first.at(idx), m_second.at(idx)};
127 return m_first.size();
130 void erase(
size_t i_first,
size_t i_last)
132 m_first.erase(m_first.begin() + i_first, m_first.begin() + i_last);
133 m_second.erase(m_second.begin() + i_first, m_second.begin() + i_last);
136 const std::vector<T1> &first;
137 const std::vector<T2> &second;