C++编程失乐园

致力于解决论坛的不足,探讨C++的原理

C++随笔 之 STL[vector]的存储技术(原创)

首先我们先来看Example Code:
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
void main()
{
 vector<int> v;
// cout<<v.allocator;
 v.push_back(0);
 v.push_back(1);
 v.push_back(2);
 v.push_back(3);
 v.push_back(4);
 v.push_back(5);
 cout<<v.max_size();
}
利用VC6.0的内存调试
 v.push_back(0);之后
//_First迭代器00481B40
//_Last迭代器00481B44
//_End迭代器004B1B44
 v.push_back(1);之后
//_First迭代器00481B00
//_Last迭代器00481B08
//_End迭代器004B1B08
为什么在执行一次push_back之后,迭代器全部会变呢?
下面我们看看P.J. Plauger的代码
 void insert(iterator _P, size_type _M, const _Ty& _X)
  {if (_End - _Last < _M)
   {size_type _N = size() + (_M < size() ? size() : _M);
   iterator _S = allocator.allocate(_N, (void *)0);
   iterator _Q = _Ucopy(_First, _P, _S);
   _Ufill(_Q, _M, _X);
   _Ucopy(_P, _Last, _Q + _M);
   _Destroy(_First, _Last);
   allocator.deallocate(_First, _End - _First);
   _End = _S + _N;
   _Last = _S + size() + _M;
   _First = _S; }
  else if (_Last - _P < _M)
   {_Ucopy(_P, _Last, _P + _M);
   _Ufill(_Last, _M - (_Last - _P), _X);
   fill(_P, _Last, _X);
   _Last += _M; }
  else if (0 < _M)
   {_Ucopy(_Last - _M, _Last, _Last);
   copy_backward(_P, _Last - _M, _Last);
   fill(_P, _P + _M, _X);
   _Last += _M; }}

其中M = 1;
当_End - _Last < _M时,就要重新分配内存了,哦原来时这样的.
[个人认为,在方便调试的时候,可以把C:\MSDEV\VC98\Include\下面的vector文件中的protected改成public:]
下面我给出在5次插入之后其内存分配
push_back(2)
//00481AC0
//00481ACC
//00481AD0
push_back(3);
//00481AC0
//00481AD0
//00481AD0
push_back(4);
//00481B20
//00481B34
//00481B40
push_back(5);
//00481B20
//00481B38
//00481B40
注意没有,_Last - _First之后的明显是size() * 4
[注:在VC6.0的STL版本是采用的PJSTL版本,是一种公认最垃圾的STL版本
在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司
在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我认为在可读性,可移植性方面最好的一个版本]

posted on 2007-01-04 14:26 木木头 阅读(936) 评论(1)  编辑 收藏 引用 所属分类: C++特性

评论

# re: C++随笔 之 STL[vector]的存储技术(原创) 2007-01-04 14:37 cppLock

个人认为,这样的话,如果数据很大,vector的效率不会很高  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

常用链接

留言簿(3)

随笔分类(29)

搜索

最新随笔

最新评论