| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 963 人关注过本帖
标题:关于容器动态增长的问题
只看楼主 加入收藏
doom5211
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-6-7
收藏
 问题点数:0 回复次数:2 
关于容器动态增长的问题
vector容器的动态增长是新分配一个内存区,把原来已经被包含在容器中的元素拷贝到新分配的内存区中,再把原来的存储区释放.对于大型复杂类对象,插入一个此元素进vector中容器的容量为1,这意味着要是再动态增加一个复杂类对象元素,会重新分配一个容量为现在两倍的存储区,再把元素拷贝到新存储区,最后再释放原存储区.
这样容器的性能很低,因为每次动态增加一个元素,都要调用对象的拷贝构造函数和析构函数(在释放原存储区时用到),对此有一种解决方案是用指针间接存储复杂类对象,这样增加用指针指代的复杂类对象时,容器的容量会从1增加到256,这样就避免了每次都要重新分配新存储区.
问题是为什么用指针后容器容量会从1增加到256? 书上说只有容器存储int类对象时容器容量才会为256.
不知道说清楚没有?这个问题是 C++ primer第三版中 第6章 抽象容器类型第6.3节中出现的. 大虾帮忙解释一下.
搜索更多相关主题的帖子: 容器 动态 内存 元素 容量 
2007-07-01 13:01
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
#include <iostream>
#include <vector>
using namespace std;


int main(){
vector<int> ivec;
for (int i = 1;i <= 10;++i){
ivec.push_back(i);
cout << "current size : " << ivec.size() << endl;
cout << "current capacity : " << ivec.capacity() << endl << endl;
}
system("pause");
}


//运行了这段代码,你会发现,vector容器有两个概念:1)大小,size;2)容量,capacity。
//他们的区别,大小是当前容器中实际元素个数,容量是可以存放元素的个数。
//当大小等于容量时,容量会增加为当前2倍,这样的目的,就是节省了重新分配内存调用构造和析构以及释放旧内//存的开销,你看书了,应该懂得vector其实就是在数组的基础上建立的。

//当存放类类型元素时,这个重新分配内存的过程会很大开销,因为不同于内置类型,类类型复制和析构会花掉很多//时间,降低效率。但是如果用指向类类型的指针,就可以使它像内置类型一样使用,因为指针对应的地址才是对象
//复制指针不会调用对象的构造函数,销毁指针也不会析构掉一个对象。


//你提到的初始化容器容量为256这个,我想是不同编译器或者标准库实现不同产生的吧。
//初始化一个容器,给它容量为1024字节,一个int占用4字节,就可以保存256个元素
//指针也占用4字节的话,当然也就是256个元素。
//书上应该是这个意思,但是如你所见,上面的代码运行出来,容量的规定不是按照这样来。


//你了解这个原理就好!

[此贴子已经被作者于2007-7-1 13:54:34编辑过]


Fight  to win  or  die...
2007-07-01 13:39
doom5211
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-6-7
收藏
得分:0 
无限循环说的好,我就是不确定指针是否也占四个字节这个地方
其他地方都基本上弄懂了.另外用指针就如同用内置类型一样这一点也是我不知道的.
所以谢谢了.

2007-07-02 17:22
快速回复:关于容器动态增长的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024841 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved