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 шт):

Автор решения: HolyBlackCat

Специального конструктора нет.

Или делать так: (выглядит не очень, честно говоря)

void func(std::vector<int> &&arr = []{std::vector<int> ret; ret.reserve(42); return ret;}())
{

}

Или писать вторую перегрузку.

→ Ссылка
Автор решения: AlexGlebe

Всё вроде-бы просто, принимаете новый вектор (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)
)
{}
→ Ссылка