stl: резервирование элементов вектора при его создании
подскажите, можно ли выполнить резервирование (выделение) элементов вектора в момент его создания, т.е. вместо
std::vector<int> arr;
arr.reserve(size);
выполнить как-то в одну команду
отчасти задача нужна для следующего:
есть функция
void func(
std::vector<int>&& arr = std::vector<int>()
)
{}
и хотелось бы, чтобы если параметр arr не указан, то формировался вектор с зарезервированными элементами
конечно задачу можно решить следующим образом (как мне кажется):
void func(
std::vector<int>&& arr = std::vector<int>()
)
{
if (arr.size() == 0) {
arr.reserve(size);
}
}
но это выглядит как-то немного топорно
Ответы (3 шт):
Специального конструктора нет.
Или делать так: (выглядит не очень, честно говоря)
void func(std::vector<int> &&arr = []{std::vector<int> ret; ret.reserve(42); return ret;}())
{
}
Или писать вторую перегрузку.
Всё вроде-бы просто, принимаете новый вектор (r-value) из другой функции.
# include <vector>
std::vector<int> makevector() {
std::vector<int> arr;
size_t size = 100 ;
arr.reserve(size);
return arr ; }
void func(
std::vector<int>&& arr = makevector()
)
{}
Если у вас функция func не рекурсивная и вам нужна скорость, то можно этот аргумент по-умолчанию хранить в "кеше" (запасной статической переменной). Тогда использование кеша даст большую помощь.
std::vector<int> && makevector(void) {
static thread_local std::vector<int> arr;
arr.clear();
size_t size = 100 ;
arr.reserve(size);
return std::move(arr) ; }
Можно так, ещё std::move где-то может потребоваться.
template <typename T>
std::vector<T> reserved_vector(size_t sz)
{
auto vec = std::vector<T>();
vec.reserve(sz);
return vec;
}
void func(
std::vector<int>&& arr = reserved_vector<int>(10)
)
{}