笔记,Vector类模板的基本功能

有基本的查找,排序,插入,删除区间,扩容,减容等
放在博客上主要是为了以后学习方便查找一些,实际上并没有上面参考价值,许多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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SP1043 GSS1 - Can you answer these queries I 猫树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 猫树是一种可以O(nlogn)O(nlogn)O(nlogn)预处理&#xff0c;O(1)O(1)O(1)查询的数据结构。预处理的信息应该满足可合并的性质&#xff0c;与线段树pushuppushuppushup的原理相同&#xff0…

.NET Core 3.0之深入源码理解HttpClientFactory(二)

写在前面上一篇文章讨论了通过在ConfigureServices中调用services.AddHttpClient()方法&#xff0c;并基于此进一步探讨了DefaultHttpClientFactory是如何创建HttpClient实例和HttpMessageHandler实例的&#xff0c;并了解了DefaultHttpClientFactory内部维护者一个定时器和两个…

链表的顺序存储

链表的顺序存储无非就是在一个结构体数组里面集成了许多函数的操作&#xff0c;使之算法变得更加简单。 #include<stdio.h> #include<windows.h> #define maxsize 100 typedef int datatype; typedef struct {datatype a[maxsize];int size; }sequence_list;void …

2021牛客暑期多校训练营6 Hopping Rabbit 扫描线 + 矩形 + 细节

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个矩形&#xff0c;以及一个距离ddd&#xff0c;让你找一个点(x0.5,y0.5)(x0.5,y0.5)(x0.5,y0.5)&#xff0c;这个点一次能向四个方向跳ddd的距离&#xff0c;这个点不管怎么跳都跳不到矩形内。输出(…

动手造轮子:基于 Redis 实现 EventBus

动手造轮子&#xff1a;基于 Redis 实现 EventBusIntro上次我们造了一个简单的基于内存的 EventBus&#xff0c;但是如果要跨系统的话就不合适了&#xff0c;所以有了这篇基于 Redis 的 EventBus 探索。本文的实现是基于 StackExchange.Redis 来实现。RedisEventStore 实现既然…

最小生成树KrusKal算法(并查集)

洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程&#xff0c;其中最主要的就是贪心和并查集的应用。 我们知道链接n个点需要n-1条边&#xff0c;这就满足的最后生成的是一颗树&#xff0c;而不是一个环。在这n-1条边的选择上我们又要尽可能的让边的权重小&#xff0…

#6278. 数列分块 2 分块 + 块内二分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 真 调一晚上血压上来了。 考虑第一个操作&#xff0c;块内打个标记&#xff0c;其他的暴力查询即可。 考虑第二个操作&#xff0c;讲块内元素排序之后&#xff0c;直接二分查询。 注意修改…

使用腾讯云提供的针对Nuget包管理器的缓存加速服务

继阿里巴巴开源镜像站&#xff08;https://opsx.alibaba.com/&#xff09;、华为云镜像站点&#xff08;https://mirrors.huaweicloud.com/ &#xff09;之后&#xff0c;腾讯也已于近日上线了类似的服务&#xff0c;官方名称为腾讯云软件源&#xff08;Tencent Open Source Mi…

最小生成树Prime算法

洛谷p1546链接 Prime算法的核心也是贪心&#xff0c;但是不同的就是&#xff0c;它是一直维护一颗树&#xff0c; 直到变成一颗最小生成树&#xff0c; #include<bits/stdc.h> using namespace std; const int maxn 110; const int inf 0x3f3f3f3f; int maze[maxn][m…

#6284. 数列分块 8 分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 乍一看貌似没有什么东西能维护块内同一个数的个数&#xff0c;但是通过第六感可以发现每次操作后区间都会被推成一个数&#xff0c;那么我们分个块&#xff0c;让后块内打个标记&#xff0…

最短路弗洛伊德(Floyd)算法加保存路径

弗洛伊德算法大致有点像dp的推导 dp[i][j] min(dp[i][k] dp[k][j], dp[i][j]), 其中 i 是起始点&#xff0c;j 是终止点。k是它们经过的中途点。 通过这个公式不断地更新dp[i][j],得到最短路径长。 我们先定义两个矩阵&#xff0c;minpath[i][j],表示的是从 i 到 j 当前得到的…

云考古 | Azure 自建 RDS 让 iPad 跑 Office 97

导语苹果一直在尝试把iPad做成电脑&#xff0c;但效果始终不如真正的PC理想。如果能在iPad上运行PC软件&#xff0c;如完整版的Office&#xff0c;那一定是一种非常理想的方式。我小时候电脑启蒙使用的第一个软件就是Office 97里的Word&#xff0c;这也是第一款引入Office助手&…

P3338 [ZJOI2014]力 FFT + 推式子

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 这个式子看起来很FFTFFTFFT&#xff0c;让我们来化简一下。 考虑EEE中直接将qiq_iqi​约掉&#xff0c;所以Ei∑j1i−1qj(i−j)2−∑ji1nqj(i−j)2E_i\sum_{j1}^{i-1}\frac{q_j}{(i-j)^2}-…

DevOps案例研究:庖丁解牛,剖析Google持续交付之道

内容来源&#xff1a;DevOps案例深度研究 –Google持续交付实践战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;姚元庆 (Topic Leader) 、任跃兵、王红阳、王晓敏、张彪本…

并查集板子加例题

//http://poj.org/problem?id1611 #include<bits/stdc.h> using namespace std; const int maxn 30010; int f[maxn],num[maxn],n,m; int find(int x) {return f[x] x ? x : f[x] find(f[x]); } int main() {while(cin >> n >> m && (n m)) {f…

架构杂谈《八》Docker 架构

Docker 架构 一、Docker 引擎的三大组件1&#xff09;Docker 后台服务&#xff08;Docker Daemon&#xff09;&#xff1a;是长时间运行在后台的守护进程&#xff0c;是Docker的核心服务&#xff0c;可以通过命令dockerd与它进行交互通信。2&#xff09;REST 接口&#xff08;R…

P3723 [AH2017/HNOI2017]礼物 FFT + 式子化简

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先可以知道&#xff0c;我们对某个数组加上一个正数数的操作可以转换成对一个数组加上一个任意数&#xff0c;所以我们设变化量为xxx。 对于∑i1n(ai−bi)2\sum_{i1}^n(a_i-b_i)^2i1∑n​…

DijKstra算法普通+堆优化链式向前星

朴素版本 #include<bits/stdc.h> using namespace std; const int maxn 10010; const int inf 0x3f3f3f3f; int a[maxn][maxn],dis[maxn],visit[maxn],n,m,s,t; void init() {for(int i 1; i < n; i)for(int j 1; j < n; j)if(i j) a[i][j] 0;else a[i][j] …

.net core 基于 IHostedService 实现定时任务

.net core 基于 IHostedService 实现定时任务Intro从 .net core 2.0 开始&#xff0c;开始引入 IHostedService&#xff0c;可以通过 IHostedService 来实现后台任务&#xff0c;但是只能在 WebHost 的基础上使用。从 .net core 2.1 开始微软引入通用主机( GenericHost)&#x…

nowcoder 清楚姐姐的翅膀们 F 一般图的最大匹配

传送门 文章目录题意思路&#xff1a;题意 思路&#xff1a; 这个题很容易就会掉到二分图匹配的坑里。。 但实际上这个是一个一般图匹配。 考虑将妹子拆点&#xff0c;一个入点一个出点&#xff0c;入点出点都连蝴蝶结。 我们看看最终会有三种匹配情况&#xff1a; (1)(1)(1)妹…