Почему в конструкторах нет аргумента емкости для контейнеров? - PullRequest
17 голосов
/ 26 апреля 2011

Если я хочу установить емкость на std::vector, я должен вызвать .reserve(...), есть ли причина, почему в конструкторе нет аргумента емкости для контейнеров в stl, std::string, std::vector

Ответы [ 3 ]

13 голосов
/ 26 апреля 2011

Есть одна очевидная причина: как будет выглядеть такой конструктор?

Все контейнеры последовательности уже имеют конструктор, который можно вызывать с одним целочисленным аргументом. Этот конструктор изменяет размеры контейнера, чтобы иметь указанное количество элементов.

Да, вы можете добавить второй параметр (например, bool reserve_instead_of_resize), чтобы иметь возможность использовать этот конструктор как для начальных размеров, так и для начальных резервов, но тогда я думаю, что конечный результат будет сбивать с толку.

11 голосов
/ 05 декабря 2012

Вы можете просто создать функцию для создания зарезервированного вектора:

// make_reserved_vector
template <typename... T>
std::vector<T...> make_reserved_vector(size_t n) {
    std::vector<T...> vec;
    vec.reserve(n);
    return vec;
}

и использовать как:

auto myvec = make_reserved_vector<int>(32768);
0 голосов
/ 21 февраля 2017

Чтобы создать вектор и одновременно указать его емкость, создайте вектор с требуемой емкостью, скопируйте в него нужные вам элементы и удалите из итератора, возвращенного функцией copy.Если конструктор медленный, просто напишите другой конструктор со специальными параметрами, которые просто резервируют память.

int main (int argc, char** argv) {
  std::vector<size_t> v (10, 0);
  size_t tmp [3] = {0, 1, 2};
  std::vector<size_t>::iterator i (v.begin ());
  i = std::copy ((const size_t*)tmp, (const size_t*) &tmp [3], v.begin ());
  v.erase (i, v.end ());
  std::cout << "\tv capacity == " << v.capacity () << std::endl;
}

выведет:

v емкость == 10

...