考虑下面的代码。
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=
?
如果没有,我可能需要用0的uSize
初始化它,然后在构造函数块中执行memcpy_s
。
发布于 2017-02-24 16:55:48
从一对迭代器初始化时,我的
bucket_
会先做reserve
吗?
是的,它确实有效。
标准草案:
复杂性:如果迭代程序first和last属于前向、双向或随机访问类别,则只调用T的复制构造函数N次(其中N是第一次和最后一次之间的距离),并且no reallocations。如果它们只是输入迭代器,它会对T的复制构造函数和order log(N)的重新分配进行order N调用。
(指针是随机访问迭代器)
发布于 2017-02-24 16:56:24
是的,可以保证不会有重新分配,因为指针是RandomAccessIterators的。vector.cons/9
分配器模板向量( InputIterator first,InputIterator last,const Allocator& =
());
效果:使用指定的分配器构造一个等于范围[first, last)
的向量。
复杂性:如果迭代器的第一个和最后一个是前向、双向或随机访问类别,则只对T
的复制构造函数进行N
调用(其中N
是first
和last
之间的距离),不进行重新分配。它使order N
调用T
和order log(N)
reallocations的复制构造函数(如果它们只是输入迭代器)。
https://stackoverflow.com/questions/42434235
复制相似问题