Почему я не могу создать вектор, используя указатель и длину

Предположим, что я хочу построить вектор C ++ STL из массива (зная его длину), то есть у меня есть:

size_t length = /* ... */
int *a = new int[length];

Я могу построить вектор следующим образом:

std::vector<int> v(a, a + length);

но не так

std::vector<int> v(a, length);

Почему векторный класс не имеет конструктора последнего типа?

0

Решение

Потому что этот конструктор является типичным beginend конструктор:

template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );

который копирует контент с first в last (не входит в комплект) и не становится владельцем выделенного динамического массива.

Большинство алгоритмов STL использует [begin, end) Диапазон, и для согласованности, также делает этот конструктор.

2

Другие решения

Стандартная библиотека C ++ почти всегда предпочитает пару начало / конец паре начало / длина.
Эта последовательность чего-то стоит.

Обычно люди хотят «просто еще одну вещь», но люди очень плохо соглашаются с тем, что является самым важным, что можно добавить. Поэтому, когда у вас есть интерфейс, который делает эту работу, откорректировать его, чтобы добавить ctr, который на самом деле не очень помогает многим людям, и который снизит согласованность, будет трудно продать.

2

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

Стандартные контейнеры обычно работают на диапазоны.

Взятие указателя и длины — больше идиома C-строки; Обратите внимание, что std::string делает есть такой конструктор, соответственно.

1

Почему векторный класс не имеет конструктора последнего типа?

Потому что это было бы лишним. Вы уже можете создавать контейнеры на последовательностях итераторов (согласованное решение по проекту в stl), поэтому дополнительные конструкторы не добавят ничего нового; Единственная причина такого конструктора была бы в том, что переключение с пар итераторов на пару итераторов-счетчиков было нетривиальным в клиентском коде.

Способ описания последовательностей широко использовался в Си; это не значит, что это делает для хорошего C ++.

Примечание: пожалуйста пожалуйста не использовать malloc в C ++ (не в рабочем коде, не в коде с однократной записью, не для простых примеров в SO и / или в других местах); это дает другим пример плохого кода и поощряет привычку к плохому коду.

0
По вопросам рекламы [email protected]