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

Does vector know to reserve first when initializing by a pair of iterators?

提问人:Chen OT 提问时间:2/24/2017 最后编辑:Chen OT 更新时间:2/25/2017 访问量:1636

问:

请考虑以下代码。

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

从一对迭代器初始化时,我是否首先执行?类似 .bucket_reservevec.reserve(std::distance(begIter, endIter))

或者它只是简单地执行一个严肃的 or ?push_backback_inserter_iterator::operator=

如果没有,我可能需要用 of 0 初始化它,然后执行 in 构造函数块。uSizememcpy_s

C++ STL

评论


答:

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 的复制构造函数,如果 它们只是输入迭代器。NTNfirstlastNTlog(N)