Подтвердить что ты не робот

Знает ли вектор резервировать первый раз при инициализации парой итераторов?

Рассмотрим следующий код.

struct MyData{
    MyData(const BYTE* pData, size_t uSize) 
        : bucket_(pData, pData + uSize) 
    {}     
    std::vector<BYTE> bucket_;
};

Является ли мой bucket_ первым reserve при инициализации из пары итераторов? Что-то вроде vec.reserve(std::distance(begIter, endIter)).

Или просто просто выполнить серьезный push_back или back_inserter_iterator::operator=?

Если это не так, мне может понадобиться инициализировать его с помощью uSize из 0, а затем сделать блок memcpy_s в конструкторе.

4b9b3361

Ответ 1

Выполняет ли мой bucket_ reserve при инициализации из пары итераторов?

Да, это действует.

Стандартный черновик:

Сложность: делает только N вызовов для конструктора копирования T (где N - расстояние между первым и последним) и без перераспределения, если итераторы первого и последнего имеют прямой, двунаправленный или произвольный доступ категории. Он делает порядок N вызовов конструктору копирования T и переупорядочению log (N), если они только вводят итераторы.

(Указатели - это итераторы с произвольным доступом)

Ответ 2

Да, он гарантировал, что перераспределения не будет, поскольку указатели являются RandomAccessIterators. vector.cons/9

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

Эффекты: Создает вектор, равный диапазону [first, last), используя указанный распределитель.

Сложность: Делает только N вызов конструктора копирования T (где N - это расстояние между first и last) и no перераспределения, если итераторы первой и последней имеют вперед, двунаправленные или произвольные категории доступа. Он выполняет порядок вызовов Nк конструктору копирования T и упорядочить log(N) перераспределения if они просто вводят итераторы.