Я реализую шаблонный класс sparse_vector. Это как вектор, но он хранит только те элементы, которые отличаются от созданного по умолчанию значения.
Таким образом, sparse_vector будет хранить лениво отсортированные пары индекса-значения для всех индексов, значение которых не равно T ().
Я основываю свою реализацию на существующих разреженных векторах в числовых библиотеках - хотя моя также будет обрабатывать нечисловые типы T. Я посмотрел на boost::numeric::ublas::coordinate_vector
и eigen::SparseVector
.
Оба магазина:
size_t* indices_; // a dynamic array
T* values_; // a dynamic array
int size_;
int capacity_;
Почему они просто не используют
vector<pair<size_t, T>> data_;
Мой главный вопрос: каковы плюсы и минусы обеих систем и что в итоге лучше?
Вектор пар управляет size_ иacity_ для вас и упрощает сопровождающие классы итераторов; у него также есть один блок памяти вместо двух, поэтому он требует половины перераспределений и может иметь лучшую локальность ссылок.
Другое решение может выполнять поиск быстрее, поскольку строки кэша заполняются только индексными данными во время поиска. Могут также быть некоторые преимущества выравнивания, если T является 8-байтовым типом?
Мне кажется, что вектор пар - лучшее решение, но оба контейнера выбрали другое решение. Почему?