LINUX.ORG.RU

История изменений

Исправление 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;
};