Jin*_*Yao 5 c++ vector std stdvector c++-standard-library
C++ 14最终工作草案做出如下评论std::vector:
存储管理是自动处理的,但可以提供提示以提高效率.
矢量的存储自动处理,根据需要进行扩展和收缩.
而动态数组的维基百科条目说:
C++
std::vector和Ruststd::vec::Vec是动态数组的实现
所以我认为当一个向量的容量远大于它的大小时,它应该自动减少它的容量.我写了下面的代码来检查我的假设:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {};
cout << "initialization" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
for (int i = 1; i <= 10000; i++)
v.push_back(i);
cout << "after inserting a lot of elements" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
v.erase(v.begin() + 1, v.begin() + 10000);
cout << "after erasing a lot of elements" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
v.push_back(9);
cout << "after inserting another element" << endl;
cout << " capacity: " << v.capacity() << endl;
cout << " size: " << v.size() << endl;
}
Run Code Online (Sandbox Code Playgroud)
我g++ -std=c++14 code.cc以前编译代码.运行结果a.out会产生以下输出.我正在使用macOS Mojave.
initialization
capacity: 0
size: 0
after inserting a lot of elements
capacity: 16384
size: 10000
after erasing a lot of elements
capacity: 16384
size: 1
after inserting another element
capacity: 16384
size: 2
Run Code Online (Sandbox Code Playgroud)
因此,std::vector即使容量远大于其容量,a似乎也不会降低容量.
会std::vector不会减少它的容量?
那么是否有一些条件可以触发其产能的减少?
所以我认为当一个向量的容量远大于它的大小时,它应该减少它的容量.
首先,标准必须指明"容量远大于其大小"的含义.这将限制当前实施对重新分配策略的选择.
其次,如果减少容量需要重新分配和移动所有剩余的元素.这意味着擦除会使所有迭代器无效,这会限制安全使用.
目前,擦除状态
在擦除点或之后使迭代器和引用无效,包括
end()迭代器.
第三,矢量同样可能再次达到容量的高水印,因为它长时间保持较小.
对于许多有效场景,您将使用量变得更糟,因为释放大量分配的可疑益处.现代虚拟内存系统处理得很好,旧的分配比neccecary严格要长.
那么是否有一些条件可以触发其产能的减少?
是的,shrink_to_fit是明确要求做你想做的事.如果你确实希望它重新分配到更小的尺寸,你可以要求它.其他用途可能会受到伤害,但不会受到影响.
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |