Почему в C++ 11 нет вектора (size_type n, const Allocator& alloc)?

В C++11 std::vector имеет конструктор vector(size_type n) который будет строить по умолчанию n элементы на месте, которые можно использовать с классами по умолчанию, которые можно создавать, перемещать и не копировать.

Однако, в отличие от любого другого векторного конструктора, нет варианта, который бы использовал распределитель, и я прибег к следующему:

// Foo is default constructible and moveable, but not copyable
const int n = 10; // Want 10 default constructed Foos
std::vector<Foo, CustomAllocator> foos(allocator);
foos.reserve(n);
for (int i = 0; i < n; ++i)
   foos.emplace_back();

Есть ли лучший способ сделать это? Есть ли конкретная причина vector(size_type n, const Allocator& alloc) был исключен из стандарта?

2 ответа

Решение

Подумав об этом, в конце концов, это не будет дефектом.

Возможно, что allocator_type а также value_type извращенно того же типа. В этом случае, какая функция будет vector(3, alloc) вызов? Конструктор, который принимает значение по умолчанию для копирования-инициализации во все элементы, или тот, который принимает размер и распределитель? Это неоднозначно, и, следовательно, ошибка компиляции.

Во-первых, вместо вашего reserve/ цикл вещь, вы можете просто использовать resize чтобы достичь того, что сделает ваш воображаемый конструктор:

const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);

Другой вариант заключается в использовании версии с тремя аргументами size_type n конструктор:

const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);

Хотя это на самом деле копирует конструкции в элементы, которые могут быть или не быть приемлемыми.

На обоснование? Без понятия. Вероятно, упускается из виду.

Другие вопросы по тегам