Почему в C ++ 11 нет вектора (size_type n, const Allocator & alloc)? - PullRequest
6 голосов
/ 24 февраля 2012

В 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 ]

7 голосов
/ 24 февраля 2012

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

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

7 голосов
/ 24 февраля 2012

Во-первых, вместо вашей reserve / loopry штуки, вы можете просто использовать 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);

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

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

...