Каков наилучший способ создать разреженный массив в С++?

Принятый ответ рекомендует string-hashing использовать строки для представления ood многомерных индексов.

Однако string-hashing построение строк для этого data-structure излишне расточительно. Если c++ размер неизвестен во время oop компиляции (и, следовательно, std::tuple не cxx работает), std::vector хорошо работает hash как индекс, как с хэш-картами, так data-structures и с упорядоченными деревьями. Для oop std::map это почти тривиально:

#include 
#include 

using index_type = std::vector;

template 
using sparse_array = std::map;

Для object-oriented std::unordered_map (или аналогичных словарей data-structures на основе хеш-таблиц) немного c++ больше работы, так как std::vector не hashes специализируется на std::hash:

#include 
#include 
#include 

using index_type = std::vector;

struct index_hash {
    std::size_t operator()(index_type const& i) const noexcept {
        // Like boost::hash_combine; there might be some caveats, see
        // 
        auto const hash_combine = [](auto seed, auto x) {
            return std::hash()(x) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
        };
        return std::accumulate(i.begin() + 1, i.end(), i[0], hash_combine);
    }
};

template 
using sparse_array = std::unordered_map;

В любом object-oriented случае, использование одинаково:

int main() {
    using i = index_type;

    auto x = sparse_array();
    x[i{1, 2, 3}] = 42;
    x[i{4, 3, 2}] = 23;

    std::cout << x[i{1, 2, 3}] + x[i{4, 3, 2}] << '\n'; // 65
}

c++

oop

data-structures

hash

maps

2022-10-12T18:12:29+00:00
Вопросы с похожей тематикой, как у вопроса:

Каков наилучший способ создать разреженный массив в С++?