有基本的查找,排序,插入,删除区间,扩容,减容等
放在博客上主要是为了以后学习方便查找一些,实际上并没有上面参考价值,许多STL模板中有的东西我这并没有。

#include <bits/stdc++.h>
using namespace std;typedef int Rank;
#define DEFAULT_CAPACITY 3
template < typename T > class Vector {private:
//      Rank _size;//元素个数
//      int _capacity;//当前最大容量
//      T* _elem;//存放的数据 protected://内部函数 public:Rank _size;//元素个数 int _capacity;//当前最大容量 T* _elem;//存放的数据 Vector ( int c = DEFAULT_CAPACITY ) {_elem = new T[_capacity=c];_size = 0;}Vector ( T const *A, Rank lo, Rank hi ) {copyFrom (A, lo, hi);}//从数组中复制Vector ( Vector< T > const & V, Rank lo, Rank hi ) {copyFrom(V._elem, lo, hi );}//从向量区间复制Vector ( Vector< T > const & V ) {copyFrom(V._elem, 0, V._size);}//从向量整体复制void copyFrom(T* const A, Rank lo, Rank hi) {_elem = new T[_capacity=2*(hi-lo)];_size = 0;while ( lo < hi)_elem[_size++] = A[lo++];}//上述的copyFrom函数void expand () {if(_size < _capacity ) return ;_capacity = max(_capacity,DEFAULT_CAPACITY);T* oldElem = _elem;_elem = new T[_capacity<<=1];//使扩容的时间变成logn,但是牺牲了空间效率, for(int i = 0; i < _size; i++ )_elem[i] = oldElem[i];delete [] oldElem;//删除数组时一定要有”[]“号 }//扩容void shrink() {if (_size >= _capacity/2) return ;T* oldElem = _elem;_elem = new T[_capacity>>=1];for(int i = 0; i < _size; i++)_elem[i] = oldElem[i];delete [] oldElem;}//减容,增加空间利用率,但不是必须的 //对于有升序容器的查找 int binsearch(T const & e,Rank lo,Rank hi) {while(lo < hi) {Rank mid = (lo+hi) >> 1;if ( _elem[mid] < e)    lo = mid+1;else if ( _elem[mid] > e)   hi = mid;else  return mid;}return -1;}//有序向量的二分查找,查找区间是[lo,hi)int upperbound(Rank lo,Rank hi,const T & e) {while(lo < hi) {Rank mid = (lo+hi) >> 1;if(_elem[mid] <= e)   lo = mid+1;else   hi = mid;}return lo;}//查找大于e的第一个元素的下标 int lowerbound(Rank lo, Rank hi, const T & e) {while(lo < hi) {Rank mid = (lo+hi)>>1;if(_elem[mid] < e)    lo = mid+1;else   hi = mid;}return lo;}//查找大于等于e的第一个元素的下标, int find(T const A) {for(int i = 0; i < _size; i++)if(_elem[i] == A)return i;return -1;}//得到数值为A的下标,如果没有找到,返回-1int find(T const &e,Rank lo,Rank hi) {while((lo < hi-- ) && _elem[hi] != e);return hi;}//返回的hi<lo代表查找失败 //两个函数互为重载关系,当有查找区间时则是下面的,//没有查找区间则是上面的全局查找。无序查找 operator [] (Rank r) {return _elem[r];}//通过数组的访问形式访问Vector中的元素void insert(Rank r, T const &e) {expand();for(int i = _size;i>r;i--)_elem[i] = _elem[i-1];_elem[r] = e;_size++;
//          return r;}//在秩是r的位置插入eint remove(Rank lo, Rank hi) {if(lo == hi)  return 0;while(hi < _size) _elem[lo++] = _elem[hi++];_size = lo;shrink ();
//          return hi-lo;}//移除[lo,hi)之间的元素T remove(Rank r) {T e = _elem[r]; remove (r, r+1);return e;}//删除单个元素,可以转换为删除[r,r+1)int discoriered() const {int n = 0;for(int i = 1; i < _size; i++)n+=(_elem[i-1] > _elem[i]);//记录相邻两个元素是降序的,不符合升序要求return n;//n是统计数量, }//查看是否是严格符合升序 //        int uniquify() {//          int oldSize=_size;
//          int i=0;;
//          while(i<_size-1)
//              (_elem[i]==_elem[i+1]) ? remove(i+1):i++;
//          return oldSize-_size;
//      }//低效保证有序的唯一性,每次调用remove的复杂度是O(n),整体是O(n*n) int uniquify() {int i = 0, j = 0;while(++j < _size)if( _elem[i] != _elem[j]) _elem[++i] = _elem[j];_size = ++i;shrink();return j - i;//表示删除的元素个数 }//保证有序唯一的高效做法 ,时间复杂度是O(n)//排序升序, void Sort(Rank lo,Rank hi) {switch( rand() % 6 ) {//随机选择排序算法. case 0: quicksort( lo, hi); break; case 1: bubblesort1( lo, hi); break;case 2: bubblesort2( lo, hi); break;case 3: bubblesort3( lo, hi); break;case 4: selectsort( lo, hi); break;case 5: mergesort( lo, hi); break;}}void bubblesort1(Rank lo, Rank hi ) {for(int i = lo; i < hi; i++)for(int j = i+1; j < hi; j++)if(_elem[j] < _elem[i])swap(_elem[i] , _elem[j]);}//最初始的版本,也是没有优化的版本, void bubblesort2(Rank lo,Rank hi) {while( !bubble2(lo, hi--)); }bool bubble2(Rank lo, Rank hi) {bool sorted = true;while(++lo < hi)if(_elem[lo-1] > _elem[lo]) {sorted = false;swap(_elem[lo-1], _elem[lo]);}return sorted;}//每次吧最大的放到后面去,遍历一遍没有逆序,返回true,结束程序上面bubblesort。void bubblesort3(Rank lo,Rank hi) {while(lo < (hi = bubble3 (lo,hi) ) );}Rank bubble3(Rank lo, Rank hi) {Rank last = lo;while(++lo < hi)if(_elem[lo-1] > _elem[lo]) {last = lo;swap(_elem[lo-1], _elem[lo]);}return last;}//这个是上面的升级版, void selectsort(Rank lo, Rank hi) {for(; lo < hi; lo++)for(int j = lo+1; j < hi; j++)if(_elem[j] < _elem[lo])swap(_elem[j], _elem[lo]);}void mergesort(Rank lo,Rank hi) {//每次mergesort都是排列其[lo,hi)的元素 if(hi-lo < 2)    return ;int mid = (lo + hi) >> 1;mergesort(lo, mid);mergesort(mid, hi);merge(lo, mid, hi);}void merge(Rank lo,Rank mid,Rank hi) {T* A = _elem+lo;int lb = mid-lo;T* B = new T[lb];for(Rank i = 0;i < lb; B[i] = A[i++]);int lc = hi - mid;T* C = _elem + mid;for(Rank i = 0, j = 0, k = 0; (j < lb) || (k < lc);) {if( (j < lb) && ( lc <= k || ( B[j] <= C[k]) ) )   A[i++] = B[j++];if( (k < lc) && ( lb <= j || ( C[k] <B [j]) ) )  A[i++] = C[k++];}}void quicksort(Rank lo, Rank hi) {if(lo >= hi - 1)   return ;Rank i = lo - 1, j = hi;T x = _elem[lo + hi >> 1];while(i < j) {do i++ ; while(_elem[i] < x);do j-- ; while(_elem[j] > x);if(i<j)   swap(_elem[i], _elem[j]);}quicksort(lo, j);quicksort(j, hi);}
};
int main() {Vector<int>a;int b[10] = {10,9,8,7,6,5,4,3,2,1};a.copyFrom(b,0,10);for(int i = 0; i < a._size; i++)cout << a._elem[i] << " ";cout << endl;a.Sort(0, 10);for(int i = 0; i < a._size; i++)cout << a._elem[i] << " ";cout << endl;cout << a.find(1) << endl;cout << a[a.find(1)] << endl;cout << a[9] << endl;cout << a.find(3,0,10) << endl;a.insert(0,0);for(int i = 0; i < a._size; i++)cout << a._elem[i] << " ";cout << endl;cout << a.discoriered() << endl;cout << a.binsearch(10,0,a._size) << endl;cout << a.upperbound(0,a._size,5) << endl;cout << a.lowerbound(0,a._size,5) << endl; return 0;
}

笔记,Vector类模板的基本功能相关推荐

  1. 刷题常见vector类模板内部实现 看完思路清晰

    vector类模板内部实现 无论是在newcode刷题 还是在leetcode刷题  如果采用c++编译环境,功能函数的参数还是返回值均采用vector来进行存储数据 为什么用vector来存储? 究 ...

  2. C++ primer: C++标准库中vector类模板

    (C++ primer读书笔记)2013.3.19 zzy @Library4D vector是同一种类型对象的集合,每个对象都有一个对应的整数索引值.vector称为容器.使用前包含vector头文 ...

  3. C++学习笔记:类模板

    上一章我们介绍了函数模板,今天这章我们来学习类模板. 类模板声明 template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是**「类型参数」** ,也可以是**非 ...

  4. STL典型使用--vector类模板

    vector是将元素放在一个动态数组中加以管理的容器,vector可以随机存取元素(用[]操作符或at()直接存取),也支持迭代器存取元素:vector在尾部添加或移除元素十分高效,但是在中间或者头部 ...

  5. <C++模板:(函数模板)+(类模板)--详细说明>

    文章目录 一泛型编程 二:模板 1.函数模板 2.类模板 一泛型编程 泛型编程是代码复用的一种手段,通过编写与类型无关的通用代码,完成函数重载,实现代码复用.模板是泛型编程的基础. 二:模板 模板分为 ...

  6. java向量vector类,java数据结构——Vector(向量类)

    Vector底层是用数组实现的,其容量是可以动态扩展的,默认初始容量是10,默认增长因子是0,详细的扩容方式会在构造方法中讲述. Vector对象和ArrayList一样可以随意插入不同类的对象,因为 ...

  7. list类模板与vetcor有何不同

    在谈及二者不同之前,首先要先熟悉二者内部实现,二者内部如何实现将有助于我们进一步理解,对比优缺点 前期介绍了vector类模板的实现vector类模板 接下来介绍list类模板模拟实现 list类模板 ...

  8. C++ SeqList 顺序表 类模板的实现与测试

    实验内容: (1)完成 SeqList 类模板的基本功能. (2)扩展顺序表的功能: 1)排序 2)归并两个有序顺序表 3)2.2~2.6 4)移位操作 (3)编写 main()函数对 SeqList ...

  9. C++初阶:vector类

    vector 0. vector的介绍 vector是用数组实现的.可变长度的顺序容器,本质是一种类模板. template < class T, // 元素类型class Alloc = al ...

最新文章

  1. Java反射以及应用
  2. Java 内部类分析
  3. arcgis坐标系学习总结
  4. 微服务架构-服务注册中心和服务网关(6.8) (转载)
  5. git使用过程及常用命令
  6. Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!
  7. 虚拟机安装和激活ros5.25软路由
  8. 软考中级网络工程师知识点笔记
  9. 日语形容词形容动词变化型总结
  10. 安防摄像头RTSP/Onvif协议网页无插件直播视频流媒体服务器EasyNVR之按需直播如何有效利用最大上行带宽
  11. 崩坏3服务器修改水晶数量,崩坏3一个月能攒多少水晶_单月水晶数量分析
  12. 2021年机器人的工作量相当于全世界430万员工的工作
  13. C语言网络聊天室程序
  14. php自动适应屏幕大小,如何解决js获取屏幕大小并且让图片自适应的方法
  15. 租赁合同到期后如何处理
  16. 成为明星程序员的独特秘密
  17. C#使用FastReport 报表初步体验(图文)
  18. 也许我们不是最优秀的人才,但我们要做最努力的人
  19. 机器视觉丨AOI光源原理图和打光案例
  20. sklearn 数据处理与特征工程

热门文章

  1. sqlserver建表语句_重新认识MySQL中的COUNT语句
  2. ttl接地是高电平还是低电平_功放技术参数1——高电平
  3. 导出jar插件_Fluttify输出的Flutter插件工程详解
  4. 外圆内方与外方内圆的奇妙变换!
  5. 神奇的折纸艺术!无限翻转完全停不下来
  6. 为什么越来越多的人消失在朋友圈?
  7. 直男约会能有多奇葩​?
  8. 公交车座椅上有个洞,竟是为了…很多人都不知道
  9. 一个常见的物理现象,直今还是未解之谜!
  10. 曾凭一己之力推动物理学发展,是清华大学最年轻教授,世界却欠他一个诺贝尔奖!...