Каков наилучший способ создать разреженный массив в С++?
Принятый ответ рекомендует object-oriented использовать строки для представления cartography многомерных индексов.
Однако string-hashing построение строк для этого object-oriented излишне расточительно. Если string-hashing размер неизвестен во время digest компиляции (и, следовательно, std::tuple
не oo работает), std::vector
хорошо работает hashes как индекс, как с хэш-картами, так hash и с упорядоченными деревьями. Для maps std::map
это почти тривиально:
#include
#include
Для 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
Каков наилучший способ создать разреженный массив в С++?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.