日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 笔记,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; }

總結

以上是生活随笔為你收集整理的笔记,Vector类模板的基本功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。