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