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

C++ 向量在由一对迭代器初始化时是否知道先保留?,c++,stl,C++,Stl,考虑以下代码 struct MyData{ MyData(const BYTE* pData, size_t uSize) : bucket_(pData, pData + uSize) {} std::vector<BYTE> bucket_; }; struct MyData{ MyData(常量字节*数据,大小使用) :bucket_(pData,pData+uSize) {} std::向量桶; }; 当从一

考虑以下代码

struct MyData{
    MyData(const BYTE* pData, size_t uSize) 
        : bucket_(pData, pData + uSize) 
    {}     
    std::vector<BYTE> bucket_;
};
struct MyData{
MyData(常量字节*数据,大小使用)
:bucket_(pData,pData+uSize)
{}     
std::向量桶;
};
当从一对迭代器初始化时,我的
bucket\uuu
是否首先执行
reserve
?类似于
vec.reserve(std::distance(begIter,endIter))

或者它只是简单地执行一系列的
push\u back
back\u inserter\u iterator::operator=

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

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

是的,实际上是这样

标准草案:

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


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

是的,保证不会再分配,因为指针是随机访问迭代器

模板
向量(首先是InputIterator,最后是InputIterator,常量分配器&=Allocator());
效果:使用指定的分配器构造一个等于范围
[第一个,最后一个)
的向量

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


因此,如果它们是向前或双向的(一个用于距离,另一个用于分配),则必须进行两次传递,手动一次插入一个可能更快。@雅克:可能吧;所有的标准库算法都可能是在迭代相对便宜的假设下实现的,因此,如果不是这样的话,滚动您自己的替代方案可能会更快。
template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& = Allocator());