1#ifndef ALGORITHMS_NAMED_VECTOR_H
2#define ALGORITHMS_NAMED_VECTOR_H
8namespace named_vector {
19 std::vector<T> elements;
20 std::vector<std::string> names;
23 template <
typename... _Args>
24 T& emplace_back(_Args&&... __args)
26 return elements.emplace_back(std::forward<_Args>(__args)...);
29 void push_back(
const T& element) { elements.push_back(element); }
31 void push_back(T&& element) { elements.push_back(std::move(element)); }
33 T& operator[](
int index) {
return elements[index]; }
35 const T& operator[](
int index)
const {
return elements[index]; }
37 bool has_names()
const {
return !names.empty(); }
39 void set_name(
int index,
const std::string& name)
41 assert(index >= 0 && index < size());
42 int num_names = names.size();
43 if (index >= num_names) {
48 names.resize(index + 1,
"");
53 const std::string& get_name(
int index)
const
55 assert(index >= 0 && index < size());
56 int num_names = names.size();
57 if (index < num_names) {
64 static std::string empty;
69 int size()
const {
return elements.size(); }
71 bool empty()
const {
return elements.empty(); }
73 typename std::vector<T>::reference back() {
return elements.back(); }
75 typename std::vector<T>::iterator begin() {
return elements.begin(); }
77 typename std::vector<T>::iterator end() {
return elements.end(); }
79 typename std::vector<T>::const_iterator begin()
const
81 return elements.begin();
84 typename std::vector<T>::const_iterator end()
const
86 return elements.end();
95 void reserve(
int capacity)
99 elements.reserve(capacity);
102 void resize(
int count)
106 elements.resize(count);
109 void resize(
int count,
const T& value)
113 elements.resize(count, value);