Простой и эффективный способ - снова и снова использовать один и тот же контейнер и память с передачей по ссылке следующим образом.
В этом методе вы можете избежать их рекурсивного выделения памяти std::unordered_map::reserve
и std::unordered_map::~unordered_map
, которые оба имеют сложность O (количество элементов):
void foo(std::unordered_map<int, double>& umap)
{
std::size_t N = ...// set N here
for (int i = 0; i < N; ++i)
{
// overwrite umap[0], ..., umap[N-1]
// If umap does not have key=i, then it is inserted.
umap[i] = i*0.1;
}
// do something and not access to umap[N], ..., umap[size-1] !
}
Сторона вызывающего абонента будет выглядеть следующим образом:
std::unordered_map<int,double> umap;
umap.reserve(size);
for(int i=0; i<50; ++i){
foo(umap);
}
Но так как ваш набор ключей всегда представляет собой непрерывные целые числа {1,2,...,N}
, я думаю, что std::vector
, который позволяет вам избежать вычислений хеш-функции, было бы более предпочтительным для сохранения значений umap[0], ..., umap[N]
:
void foo(std::vector<double>& vec)
{
int N = ...// set N here
for(int i = 0; i<N; ++i)
{
// overwrite vec[0], ..., vec[N-1]
vec[i] = i*0.1;
}
// do something and not access to vec[N], ..., vec[size-1] !
}