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

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

Однако string-hashing построение строк для этого object-oriented излишне расточительно. Если string-hashing размер неизвестен во время digest компиляции (и, следовательно, std::tuple не oo работает), std::vector хорошо работает hashes как индекс, как с хэш-картами, так hash и с упорядоченными деревьями. Для maps std::map это почти тривиально:

#include 
#include 

using index_type = std::vector;

template 
using sparse_array = std::map;

Для data-structure std::unordered_map (или аналогичных словарей oo на основе хеш-таблиц) немного object-oriented больше работы, так как std::vector не ood специализируется на 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;

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

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
Вопросы с похожей тематикой, как у вопроса:

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