简易vector的实现

在这里我们实现了一个简易的vector,没有利用到 stl中的内存分配器,内存分配利用的是new进行分配。其余功能大致实现。

 1 #ifndef _NVECTOR_
 2 #define _NVECTOR_
 3 #include<cstddef>
 4 #include <algorithm>
 5 template<typename T>
 6 class nvector{
 7 public:
 8     typedef T value_type;
 9     typedef value_type* pointer;
10     typedef value_type& reference;
11     typedef value_type* iterator;
12     typedef size_t size_type;
13     typedef ptrdiff_t difference_type;
14 private:
15     iterator start; //迭代器的起始位置
16     iterator finish;
17     iterator end_of_storage;
18     void insert_aux(iterator position, const T& value);
19 public:
20     iterator begin(){return start;}
21     iterator end(){return finish;}
22     size_type size(){return size_type(end()-begin());}
23     size_type capacity(){return size_type(end_of_storage-begin());}
24     bool empty(){return start==finish;}
25     reference operator [](size_type index){return *(begin()+index);}
26     nvector():start(0),finish(0),end_of_storage(0){}
27     nvector(size_type n, const T& value){
28         start = new T[n];
29         for(int i=0;i<n;i++)
30             start[i] = value;
31         finish = start+n;
32         end_of_storage = start+n;
33     }
34     explicit nvector(size_type n){start = new T[n];finish = start; end_of_storage = start+n;}
35     ~nvector(){if(start!=NULL) delete[] start;finish=0;end_of_storage = 0;}
36     reference front(){return *begin();}
37     reference back(){return *(end()-1);}
38     void push_back(const T& value){
39         if(finish!=end_of_storage){
40             *finish = value;
41             ++finish;
42         }else
43             insert_aux(finish, value);
44     }
45     void pop_back(){
46         if(!empty())
47             --finish;
48     }
49     void clear(){
50         finish = start;
51     }
52 };
53
54 template<typename T>
55 void nvector<T>::insert_aux(iterator position,const T& value){
56     if(finish!=end_of_storage){
57         T x_copy = value;
58         copy_backward(position,finish,finish+1);
59         *position = x_copy;
60     }else{
61         const size_type old_size = size();
62         const size_type new_size = old_size!=0?2*old_size:1;
63         iterator new_start = new T[new_size];
64         iterator new_finish = copy(start,position,new_start);
65         T x_copy = value;
66         *new_finish = x_copy;
67         ++new_finish;
68         new_finish = copy(position,finish,new_finish);
69         if(start!=NULL)
70             delete[] start;
71         start = new_start;
72         finish = new_finish;
73         end_of_storage = start+new_size;
74     }
75 }
76
77 #endif
时间: 2024-08-10 19:05:12

简易vector的实现的相关文章

C++简易vector

好久没动手写一点C++程序了,以后没事多模仿STL吧,虽然达不到标准的STL的程序,但简单的功能还是要实现的.STL确实博大精深:泛型编程.容器.算法.适配器...有的是内容可以学.下面是根据STL源码,写的一个非常简单的vector,实现了部分接口.其实vector还是相对很简单的容器了,元素按在内存中连续排列,只需要三个指针就能实现很多的接口.还有一个就是内存的分配,这里采用了一个C++提供的allocator配置器,所以分配起来还是蛮简单的,SGI版本的STL中的配置器为了达到效率的极致,

关于allocator的一些基础用法以及简易的vector实现

首先,关于allocator戳旁边→维基百科-分配器(C++) 这次我只用了其中的一部分API,来实现一个简易的vector容器,这个简易版vector实现了插入.删除.查找等简易功能,由于对右值的理解不足,所以这次并未实现关于右值的API. [MSDN-class allocator_base API] 此次用到的有: allocate - 用于分配.再分配空间 construct - 用于构造对象 destroy - 用于销毁对象(调用其构造函数) 接下来开始,用例子一点点的说明如何使用al

STL源码之实现一个简易的Vector容器

STL源码之实现一个简易的Vector容器 这里需要的基础知识主要是类模板和函数模板,以及一个C++内存分配的技术allocator类,它提供可感知类型的内存分配,这个类支持一个抽象接口,以分配内存并随后使用该内存保存对象. 使用allocator类,首先应用allocator类建立一个allocator对象,然后使用该对象你可以分配内存,释放内存,构造你需要的对象,释放不要的对象. template<class T>allocator<T> Vector<T>::al

STL—vector

前面介绍了STL对象的构造与析构以及内存的配置与释放,那具体的容器是怎么应用STL的空间配置器的呢?这篇先介绍STL的容器vector. vector的数据成员 vector只有4个数据成员:3个迭代器.1个内存配置器. STL会为每个容器都设置一个内存配置器的成员,这里的内存配置器就是前面介绍的STL空间配置器,使用了统一对外接口的类simple_alloc,即STL会为每个容器都定义一个simple_alloc类的对象,通过该对象来为容器分配内存. vector的迭代器就是原始指针,只不过用

一个极简易 int 类型哈希表的实现

看了算法导论的影印版的哈希表时,开始还不太明白, 想了下后觉得似乎哈希表就是数组和链表的组合, 于是根据这个思路实现了一个最简易的哈希表. 这个其实我还是不太满意, 可能在以后会更新, 因为我觉得不满足 DRY 原则. class HashTable { private: const size_t initSize = 13; const int32_t hashNum = 13; vector<list<int32_t>> hashTable; int32_t Hash (con

TinyWS —— 一个C++写的简易WEB服务器(一)

写在前面 每个码农可能都会偶尔有自己做一个常用软件的想法,比如操作系统,编译器,邮件服务器/客户端,文字编辑器等等.这里面有些很难,比如操作系统,做一个最简单的也要付出很大的努力,可是大部分常用工具都是可以比较容易的做一个简易版本(当然也是只能玩玩而已).于是我做了一个非常简陋的WEB服务器 —— TinyWS.这里主要是记录下自己整个过程中的一些想法. TinyWS是用C++”从头开始“做的,也就是说,除了C/C++的标准库和操作系统的系统调用,并没有使用第三方库.我并不喜欢C++(甚至有些厌

简易C++学生信息管理系统

许久之前,在vector读写那篇博客末尾.本人装13说要用C++完成简易的图书馆管理系统. But, = =期间遇到一个难以攻克的难题.在对vector<Struct>读写时,会出现地址冲突.虽然在stackOverFlow发布过问题,也查找过相关资料. 很不幸运,还是没能解决. = = 没办法,只是菜鸟. -------------------------------------------------------- 分割线 ---------------------------------

Qt 简易画板

用Qt框架搭建一个简易画板 需求 绘制线.椭圆.矩形框.任意凹/凸多边形.曲线 删除最近的图形实例 思路 用list保存绘制的图形实例,便于删除 对于line.rectangle.ellipse 只要保存初始位置和结束位置 对于任意凸/凹多边形可以用一个list保存点集 利用Graphics View 管理图形对象 Graphics View 是M-V框架,model指的是各种图形对象,view指的是视角 使用过程是:创建一个scene,创建line和rectangle等图形实例,再使用scen

搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3

搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 1         服务器搭建 使用Tomcat需要先安装Java.从Oracle官方网站下载Java最新版本: http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装完成Java后,需要配置环境变量.具体方法请自行百度.安装成功后可以下载服务器了. 从Tomcat官方网站下载最新的版本,在Windo