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*');

普通坐标:

对数坐标:

结论:

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

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

意外:

如果我们将代码中的

vec.push_back(i);

换为

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

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

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

(完)

时间: 2025-01-16 08:49:15

C++ vector长度扩展机制的探究的相关文章

atitit.编程语言&#160;类与对象的&#160;扩展机制.doc

atitit.编程语言 类与对象的 扩展机制.doc 1.1. Java 下一代: 没有继承性的扩展1 1.2. 继承1 1.3. 使用cglib动态为Java类添加方法1 1.4. 工具类 1 1.5. Wrap 包装类  装饰器模式2 1.6. 扩展方法 (其实就是工具类的语法糖)2 1.7. Scala 的隐式转换2 1.8. 类别类.ExpandoMetaClass2 1.1. Java 下一代: 没有继承性的扩展 Groovy.Scala 和 Clojure 提供了许多扩展机制,但继承

OpenGL版本与OpenGL扩展机制

OpenGL版本与OpenGL扩展机制 1 opengl的版本区别(在opengl官方文档中有详细说明)    针对Opengl不同版本的升级是主要是扩展指令集.    现在版本是4.0啦1.1 opengl1.11995年,SGI推出了更为完善的OpenGL 1.1版本.OpenGL 1.1的性能比1.0版提高甚多.其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置.法线.颜色.色彩指数.纹理坐标.多边形边缘标识的传输速度,引入了新的纹理特性等等.1.

从ExtensionLoader理解Dubbo扩展机制

Dubbo的扩展机制是怎么实现的?最简单的回答就是@SPI. Dubbo的插件化思路来源于Java SPI. JAVA SPI 机制 SPI的全名为Service Provider Interface. 大多数人可能不了解,因为它是JDK针对插件或者厂商的.java spi机制的思想就是: 我们的系统的抽象模块(接口),往往有很多不同方案的实现.如日志模块,jdbc模块等.而在面向对象的设计里,我们一般都要做模块解耦,面向接口编程.但如果要切换接口的不同实现,就可能需要改动代码.为了实现模块的自

hash哈希长度扩展攻击解析(记录一下,保证不忘)

起因 这是 ISCC 上的一道题目,抄 PCTF 的,并且给予了简化.在利用简化过的方式通过后,突然想起利用哈希长度扩展攻击来进行通关.哈希长度扩展攻击是一个很有意思的东西,利用了 md5.sha1 等加密算法的缺陷,可以在不知道原始密钥的情况下来进行计算出一个对应的 hash 值. 这里是 ISCC 中题目中的 admin.php 的算法: $auth = false; if (isset($_COOKIE["auth"])) { $auth = unserialize($_COOK

Dubbo源码分析系列-扩展机制的实现

Spring可扩展Schema 像标签dubbo:monitor.dubbo:service.dubbo:provider等怎么读的,读完之后怎么又是怎么解析的呢? 以上标签都是基于Spring可扩展Schema提供的自定义配置 下面举个例子 1)创建JavaBean 首先设计好配置项,通过JavaBean来建模,如类People public class People { private String name; private Integer age; } 2)编写XSD文件 XSD文件是X

Dubbo中SPI扩展机制解析

dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name,可以通过name找到具体的实现. 每个扩展点都有一个@Adaptive实例,用来注入到依赖这个扩展点的某些类中,运行时通过url参数去动态判断最终选择哪个Extension实例用. dubbo的SPI扩展机制增加了对扩展点自动装配(类似IOC)和自动包装(类似AOP)的支持. 标注了@Activat

从零学习哈希长度扩展攻击

哈希长度扩展攻击,利用了md5.sha1等加密算法的缺陷,可以在不知道原始密钥的情况下来进行计算出一个对应的hash值. 引言 最开始出现好像是在PCTF2014上最近做题突然看见了先来看下代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php $auth = false; $role = "guest"; $salt = if (isset($_COOKIE["role"

哈希长度扩展攻击的简介以及HashPump安装使用方法

哈希长度扩展攻击(hash length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段.该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ 消息) 此类构造的散列函数.MD5和SHA-1等基于Merkle–Damgård构造的算法均对此类攻击显示出脆弱性. 如果一个应用程序是这样操作的: 准备了一个密文和一些数据构造成一个字符串里,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名) 让攻击者可以提交

AppCan Widget插件扩展机制

AppCan Widget插件扩展机制,通过AppCan平台生成的应用,可以理解为一个Widget包(即在IDE创建项目是看到的'phone'文件夹),和一个AppCan平台中间件组成的.通常的情况下,一个应用是由一个Widget+AppCan构成,那么,有没有可能说'n个Widget+AppCan'的机制呢,答应是肯定的,这就是Widget 插件机制,是针对主widget以及普通widget的一种增强性的扩展机制,可以将具有特定功能的widget封装成一个单独的widget包存放到plugin