Знает ли вектор резервировать первый раз при инициализации парой итераторов?
Рассмотрим следующий код.
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
в конструкторе.
Ответы
Ответ 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 они просто вводят итераторы.