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());