码迷,mamicode.com
首页 > 编程语言 > 详细

C++ vector长度扩展机制的探究

时间:2014-09-09 21:34:39      阅读:432      评论:0      收藏:0      [点我收藏+]

标签:c++   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 <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
	vector<int> vec;
	vector<int>::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*');

普通坐标:

bubuko.com,布布扣

对数坐标:

bubuko.com,布布扣


结论:

vector的增长在系统中呈指数增长,这样时间、空间都比较平衡。

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


意外:

如果我们将代码中的

vec.push_back(i);

换为

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

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

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


(完)

C++ vector长度扩展机制的探究

标签:c++   vector   

原文地址:http://blog.csdn.net/jmy5945hh/article/details/39160763

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!