vector动态二维数组(容器的容器)占用内存分析

之前在这里写过一篇“C++中的动态二维数组”。在C++中没有动态二维(多维)数组。但是根据原理我们可以自己创建。

在看过STL的vector源代码后"《STL源码剖析》---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组。

创建一个2x4的二维数组。想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列)。

int row=2,col=4;
	vector<vector<int> > v(row);//v为容器的容器,大小为2.
	for(int i=0; i<row; i++)
		v[i].resize(col);//里层容器大小设置为4

那么v是怎么使用内存的呢?

我知道vector开辟的是连续内存,但是vector内部的元素也是vector,内部的vector大小不知道且可变,并且内部的vector们大小也可能不一样。但是vector要求元素所占用空间是相同的,因此内部的vector中存储的元素一定不占用外部vector v的空间。

在分析了vector源代码后,可以知道vector只有三个成员变量:

iterator start;
iterator finish;
iterator end_of_storage;  

这三个都是原生态指针,在32位机上占用12字节。因此每个内部元素vector只占用12个字节,内部元素vector存储的元素在其他地方开辟内存。写代码验证一下:

vector<vector<int> >::iterator iter1=v.begin();
vector<vector<int> >::iterator iter2=iter1+1;
cout<<"两个迭代器之间的距离(差值)"<<(int)iter2-(int)iter1<<endl;
cout<<"vector占用内存大小:"<<sizeof(vector<int>)<<endl;

输出为:

两个迭代器之间的距离(差值)12

vector占用内存大小:12

验证了上面的说法。内部元素vector在其他地方开辟内存是连续的,也就是说每一行的元素占用内存是连续的。再写代码验证一下:

for(int i=0; i<row; i++)//初始化元素的值
	for(int j=0; j<col; j++)
		v[i][j]=i*col+j+1;
for(int i=0; i<row; i++)//输出其地址和值
{
<span style="white-space:pre">	</span>for(int j=0; j<col; j++)
	<span style="white-space:pre">	</span>cout<<&v[i][j]<<":"<<v[i][j]<<" ";
	cout<<endl;
}

输出为:

0x0012bb60:1 0x0012bb64:2 0x0012bb68:3 0x0012bb6c:4

0x0012bc90:5 0x0012bc94:6 0x0012bc98:7 0x0012bc9c:8

可见行的内存是连续的。

因此得出结论:

vector<vector<int> > v构建的动态二维数组,内部vector只占用12字节(32位机器)。从其源代码可以看到,其实所有vector只需3个成员变量。vector中的元素存储在动态开辟的内存上。

下面贴上测试代码,用的vector是SGI版本的STL,用其他版本的vector占用内存可能不一样,我用vs2010自带的试了一下,占用20个字节。

#include<iostream>
#include<fstream>
#include"vector"
using namespace std;
int main()
{
	ofstream fout("result.txt");
	int row=2,col=4;
	vector<vector<int> > v(row);//v为容器的容器,大小为2.
	for(int i=0; i<row; i++)
		v[i].resize(col);//里层容器大小设置为4

	vector<vector<int> >::iterator iter1=v.begin();
	vector<vector<int> >::iterator iter2=iter1+1;
	fout<<"两个迭代器之间的距离(差值)"<<(int)iter2-(int)iter1<<endl;
	fout<<"vector占用内存大小:"<<sizeof(vector<int>)<<endl;

	for(int i=0; i<row; i++)//初始化元素的值
		for(int j=0; j<col; j++)
			v[i][j]=i*col+j+1;
	for(int i=0; i<row; i++)//输出其地址和值
	{
		for(int j=0; j<col; j++)
			fout<<&v[i][j]<<":"<<v[i][j]<<" ";
		fout<<endl;
	}
	return 0;
}

上面的fout只是把结果输出到文件result.txt中了,便于复制。

vector动态二维数组(容器的容器)占用内存分析,布布扣,bubuko.com

时间: 2024-12-24 07:23:58

vector动态二维数组(容器的容器)占用内存分析的相关文章

C语言批量数据到动态二维数组

上一篇文章将文件读取放到静态创建的二维数组中,可是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能由于大量的数据而产生溢出呢,近期一直研究里malloc函数.通过它来动态建立所需的二维数组.因此.通过文件操作和动态创建二维数组结合起来,将大量的数据动态的放入矩阵中,不知道这种思想是否正确,下午把程序执行出来了.将程序贴上来.欢迎大家一起探讨:对于有规律的大数据txt文档怎样高效而准确的读入数组或矩阵中呢???指教!.谢谢 程序: #include<stdio.

创建动态二维数组

1 //======================================================== 2 //创建动态二维数组a [M] [N]: 3 //思路一:二维数组的抽象理解: 4 //思路二:二维数组在内存中实际排列: 5 //======================================================== 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <

以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简单分析动态二维数组,若有不足或错误之处,还请指出! 在讲这之前,以一维数组为例,先重新认识一下数组: int array[5] = {1, 2, 3, 4, 5}; 首先数组名称是该数组的首地址常量,即数组名称就是指针,就有&array[0] == array! 那么我们可以推出*array ==

C++ vector 实现二维数组

在STL中Vector这一容器,无论是在封装程度还是内存管理等方面都由于传统C++中的数组.本文主要是关于使用Vector初始化.遍历方面的内容.其他二维的思想也是类似的. 这里简单叙述一下C++ 构建二维动态数组 int **p; p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组 for (int i = 0; i < 10; ++i) { p[i] = new int[5]; } 定义一个二维整形数组并初始化: vector<vector<

c++动态二维数组(原地址:http://blog.sina.com.cn/s/blog_4e7ae8ca0100zqq6.html)

C++中用new动态创建二维数组的格式一般是这样: TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数.采用这种格式,列数必须指出,而行数无需指定.在这里,p的类型是TYPE*[N],即是指向一个有N列元素数组的指针. 还有一种方法,可以不指定数组的列数: int **p;p = new int*[10];    //注意,int*[10]表示一个有10个元素的指针数组for (int i = 0; i != 10; ++i){    p[

C/C++上二维数组的两种动态分配内存方法

最近在看一个程序的源代码的时候了解到了二维数组的动态分配空间以及释放的方法,在此记录. 一.二维数据的内存空间动态分配 方法一: void malloc2D_1(int **&a) { a = new int*[xDim]; for(int i=0;i<xDim;i++) a[i] = new int[yDim]; assert(a!=NULL); } int main() { int **arr = NULL; malloc2D_1(arr); } 首先arr是一个二级指针,为arr分配x

C++ vector 实现二维数组时, 在类的头文件中定义时遇到&quot;应输入类型符&quot;的问题?

见下,当我在类的声明文件中定义二维vector时,提示我应输入类型说明符; 但是相同的格式定义,在类中将二维vector修改为在源文件中定义就可以顺利通过,并顺利执行打印 打印结果如下: 望大神来解惑!

vector申请二维数组

vector<vector<int> >f(m,vector<int>(n));//类似于a[m][n] vector<vector<int> >f(m,vector<int>(n,1));//类似于a[m][n]且初始值全为1 vector<int>f(m,1);//申请一维动态数组 vector内部已经包含了 new和delete操作,使用前需要使用头文件#include<vector> 原文地址:http

Java的Vector的二维数组的定义及初始化

map=new Vector<Vector<Integer>>(m); for(int i=0;i<m;++i) { Vector<Integer>temp=new Vector<Integer>(); for(int j=0;j<m;++j) { temp.add(-1); } map.add(temp); } 原文地址:https://www.cnblogs.com/z2529827226/p/11620913.html