首页 > 代码库 > Vector_h
Vector_h
1 #ifndef VECTOR_H 2 #define VECTOR_H 3 4 #include <algorithm> 5 6 template<typename Object> 7 class Vector 8 { 9 private: 10 int theSize; //实际数据大小 11 int theCapacity; //实际容器容量大小 12 Object *objects; //基本数组 13 public: 14 enum { SPACE_CAPACITY = 16 }; //默认容量大小 15 16 explicit Vector(int initSize = 0) //单参数构造函数要用explicit()避免类型在后台转换 17 : theSize(initSize), theCapacity(initSize + SPACE_CAPACITY) { 18 objects = new Object[theCapacity]; 19 } 20 Vector(const Vector& rhs) : objects(NULL) { //复制构造函数--调用operator=对已有的Vector进行复制 21 operator = (rhs); 22 } 23 ~Vector() { 24 delete[] objects; 25 } 26 27 const Vector& operator = (const Vector& rhs) //重载赋值运算符 28 { 29 if (this != &rhs) //避免复制自身--混淆检验 30 { 31 delete []objects; //删除旧的内存空间 32 theSize = rhs.size(); //生成同样的样本大小 33 theCapacity = rhs.theCapacity; //生成同样的容量大小 34 35 objects = new Object[capacity()]; //生成与所复制的Vector同样容量的新数组 36 for (int k = 0; k < size(); k++) 37 objects[k] = rhs.objects[k]; 38 } 39 return *this; 40 } 41 42 void resize(int newSize) 43 { 44 if (newSize > theCapacity) //重置大小 45 reserve(newSize * 2 + 1); //新大小 46 theSize = newSize; 47 } 48 49 //扩容 50 void reserve(int newCapacity) 51 { 52 if (newCapacity < theSize) //至少和(样本大小)一样大 53 return; 54 55 Object *oldArray = objects; //oldArray--用于复制旧数组内容 56 objects = new Object[newCapacity]; 57 for (int k = 0; k < theSize; k++) 58 objects[k] = oldArray[k]; 59 60 theCapacity = newCapacity; 61 delete []oldArray; 62 } 63 64 Object& operator[] (int index) 65 { 66 return objects[index]; 67 } 68 const Object& operator[] (int index) const 69 { 70 return objects[index]; 71 } 72 73 bool empty() const { 74 return size() == 0; 75 } 76 77 int size() const { 78 return theSize; 79 } 80 int capacity() const { 81 return theCapacity; 82 } 83 //在数据尾端插入元素 84 void push_back(const Object& x) { 85 if (theSize == theCapacity) 86 reserve(2 * theCapacity + 1); 87 objects[theSize++] = x; 88 } 89 90 //在index位置前端插入数据data 91 void insert(int index, const Object& data) { 92 if (theSize == theCapacity) 93 reserve(2 * theCapacity + 1); 94 for (int i = theSize; i >= index; i--) { 95 objects[i] = objects[i - 1]; 96 } 97 objects[index] = data; 98 theSize++; 99 }100 101 void pop_back() {102 theSize--;103 }104 105 //区间删除 [lo, hi) --- 左闭右开!! --- 删除索引从 1,2..k106 int remove(int lo, int hi) {107 if (lo == hi) return 0;108 while (hi < theSize) {109 objects[lo++] = objects[hi++]; //[hi,theSize)顺次前移 hi-lo 位110 }111 theSize = lo;112 return hi - lo; //返回被删除元素数目113 }114 //重载删除一个指定位置元素--删除r位置元素,[r,r+1). 如果先写删除单个元素函数,删除区间时会低效.115 Object remove(int r) {116 Object oldElem = objects[r];117 remove(r, r + 1); 118 return oldElem; //返回删除的元素119 }120 121 //order the vector122 //二分查找--有序向量123 int Search(Object &elem, int lo, int hi) {124 while (lo < hi) { //不变性: A[0,lo) <= e < A[hi,n)125 int mid = (lo + hi) >> 1; // 以中点为轴126 (elem < objects[mid]) ? hi = mid : lo = mid + 1; // [lo,mi) 或 (mi,hi)127 } // 出口时,A[lo = hi]为大于elem的最小元素128 return --lo; // lo-1即为不大于elem的元素的最大秩129 }130 131 /*mergesort()归并排序132 /*无序向量的递归分解,两个有序的子序列合成大的子序列*/133 void mergeSort(int lo, int hi) {134 if (hi - lo < 2) return;135 int mid = (lo + hi) >> 1;136 mergeSort(lo, mid); //对前半段排序137 mergeSort(mid, hi); //对后半段排序138 merge(lo, mid, hi); //归并139 }140 141 //归并---O(nlogn), T(n) = 2T(n/2) + O(n)142 void merge(int lo, int mid, int hi) {143 //A用来存放合并后的向量,B,C进行比较(前后子向量比较)144 Object *A = objects + lo; //合并后的向量A[0,hi-lo) = objects[lo,hi)145 int lb = mid - lo;146 Object *B = new Object[lb]; //前子向量 B[0,lb) = objects[lo,mi)147 for (int i = 0; i < lb; B[i] = A[i++]); //复制前子向量148 int lc = hi - mid;149 Object *C = objects + mid; //后子向量150 for (int i = 0, j = 0, k = 0; (j < lb || k < lc);) {151 //B[i], C[k]中小者转至A的末尾. 152 //因为C本来就占据A中,不需要考虑提前耗尽情况153 if ((j < lb) && (k >= lc || C[k] >= B[j])) //C[k]已无或不小154 A[i++] = B[j++];155 if ((k < lc) && (j >= lb || B[j] >= C[k])) //B[k]已无或不小156 A[i++] = C[k++];157 }158 delete []B;159 }160 161 //有序向量的去重, 重复的元素必定紧邻,每个区间只保留单个---每次常数,累计O(n)162 int uniquify() {163 int i = 0, j = 0; //各对互异,"相邻"元素的秩,逐一扫描,直至末元素164 while (++j < theSize) {165 //跳过雷同者,发现不同元素时,向前移至紧邻元素166 if (objects[i] != objects[j]) objects[++i] = objects[j];167 }168 theSize = ++i; 169 return j - i; //返回被删除元素总数170 }171 172 173 //得到尾元素174 const Object& back() const {175 return objects[theSize - 1];176 }177 178 typedef Object * iterator;179 typedef const Object * const_iterator;180 181 iterator begin() {182 return &objects[0];183 }184 const_iterator begin() const {185 return &objects[0];186 }187 iterator end() { //尾后的不存在的指针188 return &objects[size()]; 189 }190 const_iterator end() const {191 return &objects[size()];192 }193 194 };195 196 197 198 #endif // VECTOR_H
1 /************************************************************************/ 2 /* Vs2013, c++11标准编写 测试vector.h */ 3 /************************************************************************/ 4 #include <iostream> 5 #include <cstring> 6 #include "Vector.h" 7 using namespace std; 8 9 int test[100] = { 0 }; 10 11 void Merge(int *test, int lo, int mid, int hi); 12 void MergeSort(int *test, int lo, int hi) { 13 if (hi - lo < 2) return; 14 int mid = (lo + hi) >> 1; 15 MergeSort(test, lo, mid); //对前半段排序 16 MergeSort(test, mid, hi); //对后半段排序 17 Merge(test, lo, mid, hi); //归并 18 } 19 20 //归并---O(nlogn), T(n) = 2T(n/2) + O(n) 21 void Merge(int *test, int lo, int mid, int hi) { 22 //A用来存放合并后的向量,B,C进行比较(前后子向量比较) 23 int *A = test + lo; //合并后的向量A[0,hi-lo) = int s[lo,hi) 24 int lb = mid - lo; 25 int *B = new int [lb]; //前子向量 B[0,lb) = int s[lo,mi) 26 for (int i = 0; i < lb; B[i] = A[i++]); //复制前子向量 27 int lc = hi - mid; 28 int *C = test + mid; //后子向量 29 for (int i = 0, j = 0, k = 0; (j < lb || k < lc);) { 30 //B[i], C[k]中小者转至A的末尾. 31 //因为C本来就占据A中,不需要考虑提前耗尽情况 32 if ((j < lb) && (k >= lc || C[k] >= B[j])) //C[k]已无或不小 33 A[i++] = B[j++]; 34 if ((k < lc) && (j >= lb || B[j] >= C[k])) //B[k]已无或不小 35 A[i++] = C[k++]; 36 } 37 delete[]B; 38 } 39 40 41 int main() 42 { 43 //用来测试 非模板写的 归并排序 算法 44 /*int Test[13] = { 1, 5, 2, 3, 6, 8, 9, 10, 13, 12, 4, 7, 11 }; 45 MergeSort(Test, 0, 13); 46 for (int i = 0; i < 13; i++) 47 cout << Test[i] << " "; 48 cout << endl;*/ 49 50 Vector<int> testOne; 51 int testData, cnt, index; 52 cout << "输入数字数目: "; 53 cin >> cnt; 54 cout << "输入 " << cnt << "个数: "; 55 while (cnt-- && cin >> testData) 56 { 57 testOne.push_back(testData); 58 } 59 60 cout << "显示所有元素: "; 61 for (int i = 0; i < testOne.size(); i++) { 62 cout << testOne[i] << " "; 63 } 64 cout << endl; 65 66 cout << "\n输入插入元素位置(0...k)和插入的数值: "; 67 cin >> index >> testData; 68 testOne.insert(index, testData); 69 cout << "显示所有元素: "; 70 for (int i = 0; i < testOne.size(); i++) { 71 cout << testOne[i] << " "; 72 } 73 cout << endl; 74 75 cout << "\n输入删除元素位置(0...k): "; 76 cin >> index; 77 testOne.remove(index); 78 cout << "显示所有元素: "; 79 for (int i = 0; i < testOne.size(); i++) { 80 cout << testOne[i] << " "; 81 } 82 cout << endl; 83 84 cout << "\n归并排序向量元素: \n"; testOne.mergeSort(0, testOne.size()); 85 cout << "显示所有元素: "; 86 for (int i = 0; i < testOne.size(); i++) { 87 cout << testOne[i] << " "; 88 } 89 cout << endl; 90 91 cout << "\n(有序向量)(二分查找:)输入查找元素: "; 92 cin >> testData; 93 cout << "查找位置返回(不大于查找元素的最大的秩): " 94 << testOne.Search(testData, 0, testOne.size()) << endl; 95 96 cout << "\n(有序向量)去除重复元素: \n"; testOne.uniquify(); 97 cout << "显示所有元素: "; 98 for (int i = 0; i < testOne.size(); i++) { 99 cout << testOne[i] << " ";100 }101 cout << endl;102 103 return 0;104 105 }
Vector_h
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。