向量是否知道在由一对迭代器初始化时首先保留?

Does vector know to reserve first when initializing by a pair of iterators?

本文关键字:初始化 保留 迭代器 是否 向量      更新时间:2023-10-16

请考虑以下代码。

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_backback_inserter_iterator::operator=

如果没有,我可能需要用 0 的uSize初始化它,然后在构造函数块中执行memcpy_s

从一对迭代器初始化时,我的bucket_是否首先执行reserve

是的,它确实有效。

标准草案:

复杂性:仅对 T 的复制构造函数进行 N 次调用(其中 N 是第一个和最后一个之间的距离),如果第一个和最后一个迭代器属于前向、双向或随机访问类别,则不进行重新分配。它对 T 的复制构造函数进行顺序 N 调用,如果它们只是输入迭代器,则对 log (N) 重新分配进行顺序调用。

(指针是随机访问迭代器)

是的,可以保证不会有重新分配,因为指针是随机访问迭代器。 vector.cons/9

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

效果:使用指定的分配器构造一个等于范围[first, last)的向量。

复杂性:仅对T的复制构造函数进行N调用(其中Nfirstlast之间的距离),并且没有 如果迭代器的第一个和最后一个是前向的,则重新分配, 双向或随机访问类别。它发出命令N调用 到T的复制构造函数,并订购log(N)重新分配,如果 它们只是输入迭代器。