提问人:Chen OT 提问时间:2/24/2017 最后编辑:Chen OT 更新时间:2/25/2017 访问量:1636
向量是否知道在通过一对迭代器初始化时首先保留?
Does vector know to reserve first when initializing by a pair of iterators?
问:
请考虑以下代码。
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))
或者它只是简单地执行一个严肃的 or ?push_back
back_inserter_iterator::operator=
如果没有,我可能需要用 of 0 初始化它,然后执行 in 构造函数块。uSize
memcpy_s
答:
24赞
eerorika
2/24/2017
#1
从一对迭代器初始化时,我是否首先执行?
bucket_
reserve
是的,它确实有效。
标准吃水:
复杂性:仅对 T 的复制构造函数进行 N 次调用(其中 N 是第一个和最后一个之间的距离),如果第一个迭代器和最后一个迭代器属于正向、双向或随机访问类别,则不进行重新分配。它对 T 的复制构造函数进行 N 次调用,如果它们只是输入迭代器,则对 log(N) 重新分配进行顺序调用。
(指针是随机访问迭代器)
评论
1赞
Yakk - Adam Nevraumont
2/25/2017
因此,如果它们是向前或双向的,则必须进行 2 次传递(一次用于距离,另一次用于分配)。在某些极端情况下(迭代速度比复制结果数据慢得多),手动一次插入一个可能会更快。
0赞
2/25/2017
@Yakk:可能;所有的标准库算法都可能在迭代相对便宜的假设下实现,因此当情况并非如此时,滚动自己的替代方案可能会更快。
10赞
WhiZTiM
2/24/2017
#2
是的,可以保证不会有重新分配,因为指针是 RandomAccessIterators。vector.cons/9
template <class InputIterator> vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
影响:使用指定的分配器构造一个等于范围 的向量。
[first, last)
复杂性:仅调用 (其中 是 和 之间的距离) 的复制构造函数,而 no 如果迭代器的第一个和最后一个是正向的,则重新分配, 双向或随机访问类别。它发出订单调用 到 和 order 的复制构造函数,如果 它们只是输入迭代器。
N
T
N
first
last
N
T
log(N)
评论