Предположим, что я хочу построить вектор C ++ STL из массива (зная его длину), то есть у меня есть:
size_t length = /* ... */
int *a = new int[length];
Я могу построить вектор следующим образом:
std::vector<int> v(a, a + length);
но не так
std::vector<int> v(a, length);
Почему векторный класс не имеет конструктора последнего типа?
Потому что этот конструктор является типичным begin
—end
конструктор:
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
который копирует контент с first
в last
(не входит в комплект) и не становится владельцем выделенного динамического массива.
Большинство алгоритмов STL использует [begin, end)
Диапазон, и для согласованности, также делает этот конструктор.
Стандартная библиотека C ++ почти всегда предпочитает пару начало / конец паре начало / длина.
Эта последовательность чего-то стоит.
Обычно люди хотят «просто еще одну вещь», но люди очень плохо соглашаются с тем, что является самым важным, что можно добавить. Поэтому, когда у вас есть интерфейс, который делает эту работу, откорректировать его, чтобы добавить ctr, который на самом деле не очень помогает многим людям, и который снизит согласованность, будет трудно продать.
Потому что нет необходимости в таком раздувании кода в стандартной библиотеке, когда, как вы уже указали, функциональность прекрасно сочетается с существующим конструктором.
Стандартные контейнеры обычно работают на диапазоны.
Взятие указателя и длины — больше идиома C-строки; Обратите внимание, что std::string
делает есть такой конструктор, соответственно.
Почему векторный класс не имеет конструктора последнего типа?
Потому что это было бы лишним. Вы уже можете создавать контейнеры на последовательностях итераторов (согласованное решение по проекту в stl), поэтому дополнительные конструкторы не добавят ничего нового; Единственная причина такого конструктора была бы в том, что переключение с пар итераторов на пару итераторов-счетчиков было нетривиальным в клиентском коде.
Способ описания последовательностей широко использовался в Си; это не значит, что это делает для хорошего C ++.
Примечание: пожалуйста пожалуйста не использовать malloc
в C ++ (не в рабочем коде, не в коде с однократной записью, не для простых примеров в SO и / или в других местах); это дает другим пример плохого кода и поощряет привычку к плохому коду.