设为首页 加入收藏

TOP

C++ vector长度扩展机制的探究
2015-07-20 17:43:30 来源: 作者: 【 】 浏览:7
Tags:vector 长度 扩展 机制 探究

源起:

C++ Primer 第五版,Exercise 9.38 Write a program to explorer how vectors grow in the library you use.


环境:

WIN 7 + VS 2008 32bit


测试代码:

#include 
  
   
#include 
   
     #include 
    
      using namespace std; int main() { vector
     
       vec; vector
      
       ::size_type tmp = 0; ofstream ofs("matrix.txt"); for (int i = 0, j = 1; i < 10000000; i++) { vec.push_back(i); if (vec.capacity() != tmp) { cout << j << " " << vec.capacity() << endl; ofs << j << " " << vec.capacity() << endl; tmp = vec.capacity(); j++; } } return EXIT_SUCCESS; }
      
     
    
   
  


运行结果:

1 1
2 2
3 3
4 4
5 6
6 9
7 13
8 19
9 28
10 42
11 63
12 94
13 141
14 211
15 316
16 474
17 711
18 1066
19 1599
20 2398
21 3597
22 5395
23 8092
24 12138
25 18207
26 27310
27 40965
28 61447
29 92170
30 138255
31 207382
32 311073
33 466609
34 699913
35 1049869
36 1574803
37 2362204
38 3543306
39 5314959
40 7972438
41 11958657

MATLAB可视化:

mat = load('matrix.txt');
figure(1)
plot(mat(:,1), mat(:,2));hold on;
plot(mat(:,1), mat(:,2), 'r*');
figure(2)
plot(mat(:,1), log(mat(:,2)));hold on;
plot(mat(:,1), log(mat(:,2)), 'r*');

普通坐标:

\

对数坐标:

n块ズ??λk?/y??ky系统中呈指数增长,这样时间、空间都比较平衡。

更具体的可以参考http://blog.csdn.net/dodolzg/article/details/6333779


意外:

如果我们将代码中的

vec.push_back(i);

换为

vec.resize(i) //结果相同

vec.reserve(i) //结果每次循环capacity都改变,并且等于i

说明在实际使用中,如果非常确定vector的大小,可以直接用reserve,节省空间,不会被系统“强制”分配多余内存。其他情况还是用resize更高效。


(完)

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 3225――Help with Intervals.. 下一篇ASP.NET MVC+JQuery母版页的Ajax..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)