История изменений
Исправление KennyMinigun, (текущая версия) :
Пришло мне в голову вот такое (возможно стоит использовать std::vector<std::pair<size_type, T>>
, чтоб не скакать по памяти лишний раз).
#pragma once
#include <cstdint>
#include <vector>
template <typename T>
class reindex_vector {
public:
using size_type = typename std::vector<T>::size_type;
using value_type = T;
using reference = T&;
using const_reference = const T&;
void push_back(const T& value) {
reindex.push_back(storage.size());
storage.push_back(value);
}
template <typename... Args>
void emplace_back(Args&&... args) {
reindex.push_back(storage.size());
storage.emplace_back(std::forward<Args>(args)...);
}
void move_front(size_type at) {
reindex[at] = 0;
reindex[0] = at;
}
auto size() const { return storage.size(); }
reference operator [](size_type at) { return storage[reindex[at]]; }
const_reference operator [](size_type at) const { return storage[reindex[at]]; }
private:
std::vector<size_type> reindex;
std::vector<T> storage;
};
Исходная версия KennyMinigun, :
Пришло мне в голову вот такое:
#pragma once
#include <cstdint>
#include <vector>
template <typename T>
class reindex_vector {
public:
using size_type = typename std::vector<T>::size_type;
using value_type = T;
using reference = T&;
using const_reference = const T&;
void push_back(const T& value) {
reindex.push_back(storage.size());
storage.push_back(value);
}
template <typename... Args>
void emplace_back(Args&&... args) {
reindex.push_back(storage.size());
storage.emplace_back(std::forward<Args>(args)...);
}
void move_front(size_type at) {
reindex[at] = 0;
reindex[0] = at;
}
auto size() const { return storage.size(); }
reference operator [](size_type at) { return storage[reindex[at]]; }
const_reference operator [](size_type at) const { return storage[reindex[at]]; }
private:
std::vector<size_type> reindex;
std::vector<T> storage;
};