A std::map
сортирует по ключам. Когда вы вставляете элемент, он должен сравнивать ключ нового элемента со многими другими ключами (логарифмический размер c). Поскольку ваши ключи имеют тип std::vector
, представьте себе работу, необходимую для вставки элемента, или 24600!
Также доступ становится довольно дорогим. Сложность std::map::at()
имеет логарифмический размер c, но опять же, вам нужно сравнить ключи, которые имеют тип std::vector
(я не уверен, как сортируются ключи типа std::vector
, но это предположение имеет линейный размер).
Кроме того, каждый раз, когда вы создаете std::vector
, вы выделяете динамически, что очень дорого (вы можете просто использовать std::array
для этой работы). Вы даже создаете копию при вызове GetValue(std::vector<int> xyz)
(аргумент xyz
должен быть передан как const
ссылка.
В качестве альтернативы вы можете хранить свои переменные x
, y
и z
в std::array<int, 3>
и используйте std::map<std::array<int,3>, double>
. Это решит вашу проблему времени.
В любом случае, std::map
с ключами типа std::array
так же безобразен, как карта с ключами типа std::vector
. Вы не должны использовать карты такого типа.
Я не знаю, какова точная цель вашей программы, но учтите следующее. Когда вы пытаетесь получить double
с triplet
, как вы решили, какой триплет вам нужен? Я думаю, вам нужно сделать это для каждого триплета или для некоторого случайного триплета. В обоих случаях вам на самом деле не нужен std::map
. Вы можете просто хранить оба триплета и значения в std::vector
:
// size
const size_t N = 24600;
// reserve space for vector of triplets (x, y, z) and vector of doubles (v)
std::vector<std::array<int, 3>> vec_triplets;
std::vector<double vec_values;
vec_triplets.reserve(N);
vec_values.reserve(N);
// for each triplet and double, store it in the vector
for ( ... )
{
vec_triplets.emplace_back(std::array<int, 3>{x, y, z});
vec_values.emplace_back(v);
}
// now I need to compute something using a triplet and the associated double
for (size_t idx = 0; idx < N; ++idx)
{
const auto& triplet = vec_triplets[idx];
const associated_double = vec_values[idx];
/* do whatever you need */
}