实现vector
来源:互联网 发布:淘宝折800报名入口 编辑:程序博客网 时间:2024/06/03 21:28
创建一个自定义的动态数组,用户可以为其分配初始容量,实现过程如下:
//MyVector.h#ifndef MYVECTOR1_H#define MYVECTOR1_H#include <iostream>#include <cassert>template <typename T>class MyVector{private: int capacity_; int size_; T *data; // O(n) void resize(int cap){ assert(cap >= size_); // 开辟新的空间并拷贝元素 T *newData = new T[cap]; for (int i = 0; i < size_; i++){ newData[i] = data[i]; } // 删掉以前的数据 delete[] data; // 指向新开辟的空间 data = newData; capacity_ = cap; }public: // 构造函数 MyVector(int capacity) :capacity_(capacity), size_(0){ data = new T[capacity_]; } MyVector() :MyVector(10){} ~MyVector(){ delete[] data; } // 均摊后O(1) void push_back(T e){ if (size_ == capacity_) resize(capacity_ * 2); data[size_++] = e; } // 均摊后O(1) T pop_back(){ assert(size_ > 0); T ret = data[size_ - 1]; size_--; // 为了防止复杂度震荡 if (size_ == capacity_ / 4) resize(capacity_ / 2); return ret; } // 返回大小和容量 int size(){ return size_; } int capacity(){ return capacity_ };};#endif // MYVECTOR1_H
在vector的实现过程中:
构造函数可以有默认构造函数,也可以有用户为vector分配容量;
在push_back操作时,需要判断数组的大小是否达到了最大容量,达到的话再进行插入就要溢出了,此时需要对数组进行resize操作,resize的大小时当前数组容量的两倍。
同样的,再pop_back的时候也需要考虑容量大小,进而对数组进行resize的情况,值得注意的是,在pop_back时为了防止复杂度震荡,通过判断当前size是否为容量的
14 ,如果是则进行resize,而且resize的大小为容量的12 。在resize过程中需要先新建一个数组,然后将原来的数据拷贝新建的块中,然后再将原来的内存块中的数据删去,然后用原来的指针指向现在新建的内存的数据首地址,最后保存下新的容量。
阅读全文
0 0
- vector实现
- vector实现
- vector 实现
- vector实现
- 实现vector
- vector实现
- STL vector 容器实现
- 手动实现Vector
- 自己实现迷你vector
- STL vector实现(一)
- STL vector实现
- vector的实现
- vector的实现
- 自已实现Vector
- C++实现Vector类
- Vector部分实现
- vector部分实现
- <vector> template实现
- 排序算法总结--JS
- nginx -- 正则表达式和全局变量
- 【Spring in action】自动化装配Bean、通过Java代码及xml装配Bean
- 2017 Multi-University Training Contest
- hibernate查询语言--hql
- 实现vector
- tensorflow_api_3:tf.placeholder( )
- URLEncoder.encode的默认编码问题
- flume的三种channel比较
- 读取XML文件时,总报“前言中不允许有内容”错误-分析
- 北京首席技术官架构师高端培训10月开班,约吗?
- 换行
- 本次考试总结(2017.8.16上午考试)(noip2007真题)
- centos下完全卸载 mysql