当通过一对迭代器初始化时,向量是否知道要先保留?

Che*_* OT 19 c++ stl

请考虑以下代码.

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

从一对迭代器初始化时,我bucket_是第reserve一个做的吗?有点像vec.reserve(std::distance(begIter, endIter)).

或者它只是简单地执行严重的push_backback_inserter_iterator::operator=

如果没有,我可能需要用uSize0 初始化它然后执行memcpy_s构造函数块.

eer*_*ika 23

从一对迭代器初始化时,我bucket_是第reserve一个做的吗?

是的,它确实有效.

标准草案:

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

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


Whi*_*TiM 9

是的,保证不会有重新分配,因为指针是RandomAccessIterators.vector.cons/9

template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
Run Code Online (Sandbox Code Playgroud)

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

复杂性:使只N调用的拷贝构造函数T(这里N是之间的距离firstlast),并没有重新分配,如果迭代器第一个和最后为正向,双向,或随机访问类别.如果它们只是输入迭代器,它N会对复制构造函数T和命令log(N)重新分配进行顺序调用.