
[英]does std::vector::resize() downward take O(1) time if the element type is a primitive?
[英]std::vector resize downward
C ++标准似乎没有通过resize(n)
, n < size()
或clear()
来声明容量的副作用。
它确实声明了关于push_back
和pop_back
摊销成本 - O(1)
我可以设想一种实现通常的容量变化和CLRS算法(例如,当放大时加倍,当将size to < capacity()/4
减小size to < capacity()/4
时减半)。 (Cormen Lieserson Rivest Stein)
有没有人参考任何实施限制?
调用较小大小的resize()
对vector
的容量没有影响。 它不会释放内存。
从vector
释放内存的标准习惯是将它与一个空的临时vector
swap()
: std::vector<T>().swap(vec);
。 如果要向下调整大小,则需要从原始向量复制到新的本地临时向量,然后将生成的向量与原始向量交换。
更新:为此目的,C ++ 11添加了一个成员函数shrink_to_fit()
,它是一个将capacity()
减小到size()
的非绑定请求。
实际上,该标准确实指明了应该发生的事情:
这是来自vector
,但主题对于所有容器都是相同的( list
, deque
等...)
23.2.4.2向量容量[lib.vector.capacity]
void resize(size_type sz, T c = T());
6)效果:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; //do nothing
也就是说:如果指定resize
小于元素数,则这些元素将从容器中删除。 关于capacity()
,这取决于erase()
对它的作用。
我无法在标准中找到它,但我很确定clear()
被定义为:
void clear()
{
erase(begin(), end());
}
因此, clear()
对capacity()
的影响也与erase()
对其产生的影响有关。 根据标准:
23.2.4.3向量修饰符[lib.vector.modifiers]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
4)复杂性:T的析构函数被称为等于被删除元素数量的次数....
这意味着元素将被破坏,但内存将保持不变。 erase()
对容量没有影响,因此resize()
和clear()
也没有效果。
容量永远不会减少。 我不确定标准是否明确说明了这一点,但暗示:如果n < capacity()
则不能通过resize(n)
使迭代器和向量元素的引用无效。
当我检查gcc(mingw)时,释放矢量容量的唯一方法就是mattnewport所说的。 用其他teporary向量交换它。 这段代码适用于gcc。
template<typename C> void shrinkContainer(C &container) {
if (container.size() != container.capacity()) {
C tmp = container;
swap(container, tmp);
}
//container.size() == container.capacity()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.