Если я хочу установить емкость на std::vector
, я должен вызвать .reserve(...)
, есть ли причина, почему в конструкторе контейнеров в stl, std::string
, std::vector
нет аргумента емкости,
Почему в конструкторах контейнеров нет аргументов о емкости?
Ответ 1
Есть одна очевидная причина: как выглядит такой конструктор?
Все контейнеры последовательностей уже имеют конструктор, который можно вызвать с помощью одного целочисленного аргумента. Этот конструктор изменяет размер контейнера, чтобы иметь указанное количество элементов.
Да, вы могли бы добавить второй параметр (например, bool reserve_instead_of_resize
), чтобы иметь возможность использовать этот конструктор как для начальных изменений, так и для начальных резервов, но тогда я думаю, что конечный результат будет путать.
Ответ 2
Вы можете просто создать функцию для создания зарезервированного вектора:
// 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);
Ответ 3
Чтобы создать вектор и указать его емкость в одно и то же время, создайте вектор с требуемой емкостью, скопируйте в него нужные элементы и удалите из итератора, возвращаемого копией. Если конструктор работает медленно, просто напишите другой конструктор со специальными параметрами, которые просто резервируют память.
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 capacity == 10