vector实现
2024-09-04 17:43:14
typedef int size_type;
/*
vector维护的是一个连续线性空间,提供的迭代器是Random Access Iterators即普通指针
*/
template <class T,class Alloc=alloc>
class vector
{
protected:
iterator start;//目前使用空间的头
iterator finish;//目前使用空间的尾
iterator end_of_storage;//目前可用空间的尾
public:
void push_back(const T& x);
void insert_aux(iterator position, const T& x);
int size()const{ return int(end() - begin()); }
}; /*
vector动态增加大小,并不是在原空间之后开辟新空间,因为无法保证原空间之后尚有可供配置的空间,而是以
原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间
*/
template<class T,class Alloc=alloc>
void vector::push_back(const T& x)
{
if (finish != end_of_storage)
{
construct(finish, x);
++finish;
}
else//已无备用空间
insert_aux(end(), x);
} template<class T, class Alloc = alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x)
{
const size_type old_size = size();
const size_type len = old_size != ? * old_size : ;
/*
配置原则:若原空间大小为0,则配置一个元素大小,否则配置原大小的两倍
前半段用来放置原数据,后半段用来放置新数据
*/
//data_allocator为vector专有的空间配置器
iterator new_start = data_allocator::allocate(len);
iterator new_finish = new_start;
//将原vector的内容拷贝到新vector
new_finish = uninitialized_copy(start, position, new_start);
//为新元素设定初值x
construct(new_finish, x);
++new_finish; //析构并释放原vector
destroy(begin(), end());
deallocate(); //调整迭代器
start = new_start;
finish = new_finish;
end_of_storage = new_start + len;
}
最新文章
- Word中一些问题解决
- Excel 取得一定范围内最大的有值的行号
- oracle权限
- 【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
- bestcoder.hdu.edu.cn
- Linux 挂载NTFS文件系统
- c# 应用NPOI 获取Excel中的图片,保存至本地的算法
- Java JMS 程序基础 与 ActiveMQ 安装(一)
- Linux系统的磁盘管理
- Docker Mysql数据库双主同步配置方法
- vue,在模块中动态添加dom节点,并监听
- noip 2017 时间复杂度
- Redis高可用之哨兵模式Sentinel配置与启动(五)
- SQL中树形分层数据的查询优化
- 基于Deep Learning的中文分词尝试
- Linq to SQL 练习
- Html.BeginForm() vs Ajax.BeginForm() in MVC3
- eclipse集成testng插件(离线安装方式)
- EF 序列化实体为Json时的循环引用问题(不用自己写实体,不用匿名类型,不用EF的上下文属性)
- 使用POI导出excel进阶篇