vector内部的实现1

写vector的内部方法

 1 #include<vector>
 2 using std::vector;
 3 //写一个动态内存
 4
 5 class CA{
 6     int a;
 7 public:
 8     CA(int i){ i = a; }
 9     CA();
10 };
11 template <class T>
12 class CStack
13 {
14     T pBuff[10];
15 public:
16     CStack();
17     ~CStack();
18     void push(T const& val);//入栈
19     void pop();//出栈
20     T GetTop();//得到栈顶的元素
21 };
22 template <class T>
23 void CStack<T>::pop()
24 {
25     top--;
26 }
27
28 template <class T>
29 CStack<T>::CStack()
30 {
31     top = 0;
32 }
33
34 template <class T>
35 void CStack<T>::push(T const& val)
36 {
37     pBuff[top++] = val;
38 }
39 int main()
40 {
41     CA a(1);//调用带参构造
42     CA pa[10];//调用默认构造  数组不可以用带参构造来构造
43     CA *pa1 = new CA;//调用默认构造
44
45     return 0;
46 }

写一个字节的类对自己的类进行加工封装函数 实现vector内部封装的效果 进而实现所需要的内容

  1 #pragma once
  2 template<typename T>
  3 class Myvector
  4 {
  5     T *pBuff;//给一个指针用来指向以恶个动态内存
  6     unsigned int len;//给一个长度 表示这个内存中的元素个数
  7     size_t maxSize;//存放这个动态数组的内存空间的大小
  8 public:
  9     Myvector();//默认构造
 10     Myvector(int n);//有n个T的默认构造对象 构造进这个容器
 11     Myvector(int n,T const& elem);//用n个elem对象 构造进这个容器
 12     Myvector(Myvector const& other);//深拷贝
 13     //Myvector();
 14
 15     ~Myvector();//析构函数 释放所有的对象 也会将变量删除(堆内存和栈内存)
 16     void clear();//清除 (删除堆内存里数据)
 17 public:
 18     size_t size() const;
 19     size_t capacit() const;//返回容器代下
 20     bool empty() const;//判断容器是否为空
 21 public:
 22     bool operator==(Myvector const& srcVector) const;//运算符重载==
 23     bool operator!=(Myvector const& srcVector) const; //重载运算符!=
 24 public:
 25     void assgin(int n, T const& elem);//赋值
 26     void swap(Myvector & srcVerctor);//交换
 27 public:
 28     T at(int index);//返回动态数组下标为index的元素 是c++中唯一会主动抛异常的函数
 29     T operator[](int index);//重载[]运算符
 30     T front();//得到容器中的第一个元素,不管容器为不为空
 31     T back();
 32 public:
 33     void push_back(T const& elem);//往动态数组的 尾部添加数字
 34 };
 35 template<typename T>
 36 void Myvector<T>::Myvector()//无参构造
 37 {
 38     pBuff = nullptr;
 39     len = 0;
 40     maxSize = 0;
 41 }
 42
 43 template<typename T>
 44 void Myvector<T>::~Myvector()//析构函数 清除对象
 45 {
 46     clear();//调用clear函数 重复代码通过封装函数来提高代码的效率
 47 }
 48 template<typename T>
 49 void Myvector<T>::clear
 50 {
 51     if (pBuff != nullptr)
 52     {
 53         delete[] pBuff;
 54         pBuff = nullptr;
 55         len = 0;
 56         maxSize = 0;
 57     }
 58 }
 59 template<typename T>
 60 void Myvector<T>::Myvector(int n)//n个有T的默认构造的构造对象 构造进这个容器
 61 {//n个对象构造这个容器
 62     if (n < 0)
 63     {
 64         pBuff = nullptr;
 65         len = 0;
 66         maxSize = 0;
 67     }
 68     else
 69     {
 70         len = maxSize = n;
 71         pBuff = new T[maxSize];
 72     }
 73 }
 74
 75 template<typename T>
 76 void Myvector<T>::Myvector(int n, T const& elem)//用n个elem对象来构造这个容器  &来增加传递效率
 77 {
 78     if (n < 0)
 79     {
 80         pBuff = nullptr;
 81         len = 0;
 82         maxSize = 0;
 83     }
 84     else
 85     {
 86         len = maxSize = n;
 87         pBuff[i] = new T[maxSize];
 88         for (size_t i = 0; i < len; ++i)//size_t无符号的int
 89         {
 90             pBuff[i] = elem;
 91         }
 92     }
 93 }
 94 template<typename T>
 95 void Myvector<T>::Myvector(Myvector const& other)
 96 {
 97     len = other.len;
 98     maxSize = other.maxSize;
 99     pBuff = nullptr;
100     if (len > 0)
101     {
102         pBuff = new T[maxSize];
103         for (int i = 0; i < len; ++i)
104             pBuff[i] = other.pBuff[i];
105     }
106 }
107 template<typename T>
108 size_t Myvector<T>::size() const//返回容器的长度
109 {
110     return len;
111 }
112 template<typename T>
113 size_t Myvector<T>::capacity() const//返回容器大小
114 {
115     return maxSize;
116 }
117 template<typename T>
118 bool Myvector<T>::empty() const//判断容器是否为空
119 {
120     //return pBuff == nullptr;泵使用这一种 这一种判定存不存在
121     return len == 0;//是否为0 0是空的
122 }
123 template<typename T>
124 bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
125 {
126     if (len != srcVector.len)//长度不等
127         return false;
128     for (size_t i = 0; i < len; ++i)//遍历判定内容是否相等
129     {
130         if (pBuff[i] != srcVector.pBuff[i])
131             return false;
132     }
133     return true;
134 }
135 template<typename T>
136 bool Myvector<T>::operator==(Myvector const& srcVector) const//判断容器是不是相等
137 {
138     return !(*this == srcVector);
139 }
140 template<typename T>
141 void Myvector<T>::assign(int n, T const& elem)//和带参构造类似 对容器进行赋值
142 {
143     clear();//重点:清除自身可能原有的动态内存
144     if (n > 0)
145     {
146         len = maxSize = n;
147         pBuff = new T[maxSize];
148         for (size_t i = 0; i < len; ++i)
149             pBuff[i] = elem;
150     }
151 }
152
153 void Myvector<T>::swap(Myvector & srcVector)
154 {
155     T *tempBuff = pBuff;
156     size_t tempLen = len;
157     size_t tempMaxSize = maxSize;//定义三个变量
158
159     pBuff = srcVector.pBuff;
160     len = srcVector.len;
161     maxSize = srcVector.maxSize;//数据的交换
162
163     srcVector.pBuff = tempBuff;
164     srcVector.len = tempLen;
165     srcVector.maxSize = tempMaxSize;
166 }
167 template<typename T>
168 T CMyVector<T>::at(int index)//唯一的会主动抛异常的函数
169 {
170     if (index < 0 || index >= len)
171         throw "out_of_range";//防止越界 抛异常
172     return pBuff[index];
173 }
174
175 template<typename T>
176 T CMyVector<T>::operator[](int index)//这个应该出错就出错 无法出来 按照给的要求来
177 {
178     return pBuff[index];
179 }
180 template<typename T>
181 T Myvector<T>::back()
182 {
183     return pBuff[len - 1];
184 }
185
186 template<typename T>
187 T Myvector<T>::front()
188 {
189     return pBuff[0];
190 }
191
192 template<typename T>
193 T Myvector<T>::operator[](int index)
194 {
195     return pBuff[index];
196 }
197 template<typename T>
198 void Myvector<T>::push_back(T const& elem)
199 {
200     //1 2 3 4 6 9 13 19
201     if (len >= maxSize)
202     {
203         maxSize = maxSize + ((maxSize >> 1) > 1 ? (maxSize >> 1) : 1);
204         T *tempBuff = new T[maxSize];
205         for (size_t i = 0; i < len; ++i)
206             tempBuff[i] = pBuff[i];
207         if (pBuff != nullptr)
208             delete[] pBuff;
209         pBuff = tempBuff;
210     }
211     pBuff[len++] = elem;
212 }

原文地址:https://www.cnblogs.com/liugangjiayou/p/11406312.html

时间: 2024-10-13 09:40:39

vector内部的实现1的相关文章

vector内部实现2

push_back 往动态数组的内部进行添加数据 pop_back 往动态数组的尾部进行删除数据 resize  讲元素的数量len改成num个数量  如果size()变大了,多出来的将用默认构造来创建 assert(nullptr);断言函数 可以解决出错问题 和return,throw相似 进行处理异常数据 reserve(int n);如果容器的容量不足扩大容量 maxSize=maxSize+(maxSize>>1)>1?(maxSize>>1):1)  内存不够会发

STL ——vector 学习

STL简介 C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序员以下三类数据结构的实现: 标准容器类   顺序性容器  vector 从后面快速的插入与删除,直接访问任何元素  deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速插入与删除   关联容器  

ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长:ArrayList每次增长为原来的50%;Vector每次增长为原来的100%; (从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当向集合中添加对象时,如果内部数组长度不够用时,长度会自动增长.ArrayList会增长为原来的1.5倍,Vecto

C++ vector解析 (C++ 11)

本文在我另外一个博客也同步:http://www.cnblogs.com/pengjunwei/p/4414677.html Vector表示可以改变大小的数组容器. 就像数组,其元素的向量使用连续的存储位置,这意味着还可以访问其元素上使用偏移量经常指向元素的指针,和在数组中一样有效.但与数组不同,其大小可动态变化,他们的存储容器自动处理. 在vector内部,使用动态分配的数组向量来存储他们的内容.此数组可能需要重新分配,以便规模的扩大新元素被插入时,这意味着为它分配一个新的数组,并将所有元素

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

之前在这里写过一篇"C++中的动态二维数组".在C++中没有动态二维(多维)数组.但是根据原理我们可以自己创建. 在看过STL的vector源代码后"<STL源码剖析>---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组. 创建一个2x4的二维数组.想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列). int row=2,col=4; vector<vector<int> &g

C++标准模板库之vector(Boolan)

vector是C++标准模板库中一种常见的容器,像数组类似,vector使用连续的存储空间用来保存元素,使用指针偏移可以快速的访问元素(通常认为是O1复杂度),与数组不同的是它的大小是可变的,在vector内部使用动态分配的内存保存元素,这意味着vector增长时需要重新分配内存,并将原来的原来的数据复制到该内存单元,需要很大的开销,因此vector并不会在每次新增元素时候都重新分配内存空间.vector实际容量(capacity)通常比实际大小(size)大得多.参考数据结构(C++语言版),

java1.7集合源码阅读: Vector

Vector是List接口的另一实现,有非常长的历史了,从jdk1.0开始就有Vector了,先于ArrayList出现,与ArrayList的最大区别是:Vector 是线程安全的,简单浏览一下Vector: 类定义: 1 public class Vector<E> 2 extends AbstractList<E> 3 implements List<E>, RandomAccess, Cloneable, java.io.Serializable Vector支

怎样线程安全地遍历List:Vector、CopyOnWriteArrayList

遍历List的多种方式 在讲怎样线程安全地遍历List之前,先看看通常我们遍历一个List会採用哪些方式. 方式一: for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } 方式二: Iterator iterator = list.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } 方式三: for

ArrayList/LinkedList/Vector源码分析

ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable ArrayList继承了AbstractList,实现了List,表示ArrayList实现了线性表的所有功能,本质上是一个Object数组: ArrayList实现了RandomAccess接口,表示提供随机访问功能,A