[英]Performance of vector initialization in C++
假设您从另一个容器初始化向量:
main()
{
list<int> L { 0, 1, 2 };
vector<int> V ( L.begin(), L.end() );
copy ( V.begin(), V.end(), ostream_iterator<int> ( cout, " " ) );
cout << endl;
}
向量大小是否设置一次,还是在初始化期间动态调整大小? (由于源中元素很少,因此在此示例中不成问题,但是如果源中元素太多,则可能是一个问题。)
您正在使用两个迭代器(和隐藏的分配器参数)调用std::vector
的模板化构造函数。 这是相关标准语录的意思:
23.3.6.2矢量构造函数,复制和分配[vector.cons]
template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& = Allocator());
9效果:使用指定的分配器构造一个等于[first,last)范围的向量。
10复杂度:仅对T的副本构造函数进行N次调用(其中N是第一个和最后一个之间的距离), 并且如果第一个和最后一个迭代器属于前向,双向或随机访问类别,则不进行任何重新分配 。 如果它们只是输入迭代器,它将对T的副本构造函数进行N阶调用,并对其进行log(N)重分配。
因为您是从std::list
(双向迭代器)初始化的,所以只会分配一个。
使用输入迭代器完成从标准输入OTOH的读取,然后可能会有多个重新分配。 但是请注意,元素在内存中移动的平均次数仍为O(1)
(由于采用指数内存分配策略)。
根据§23.3.6.2/ 10中的标准,只要迭代器是前向迭代器,双向迭代器或随机访问迭代器,就没有重新分配。 如果迭代器是输入迭代器,则存在O(log N)重新分配。
注意: std::list
具有双向迭代器。
您问这是如何实施的? 大概,它通过了一次以计算两个迭代器之间的距离(或调用std::distance
或内部版本),然后又进行了另一遍以实际初始化向量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.