#ifndef _VECTOR_HPP_ #define _VECTOR_HPP_ #include template class Vector { private: T *_v; int _len; int _used; void expand(); //扩容 void shrink(); //缩容 protected: void adjust(); //调整容量接口 public: //无参数构造函数 Vector(); //初始长度构造函数 Vector(int len); //构造函数-定义指定长度,相同初始值的向量 // len 初始长度 // value 初始值 Vector(int len, T value); //析构函数 ~Vector() { delete[] _v; } //获取值 T get(int a) const; //操作符重载 T& operator[](int i); //某处更改为某值 T put(int a, T value); //获取已使用数量 int getused() const { return _used; } //模扩张到某值 void expandTo(int a); int search(T value); void swap(int a, int b); int insert(int locate, int value); int remove(int locate, int value); int remove_sorted(int value); int find(int value); void bubbleSort(); void printall(); int getlen(); int count(int value); void mergeSort(int lo, int hi); }; template Vector::Vector() { _used = 1; _len = 2; _v = new T[_len]; } template Vector::Vector(int len) { _used = len; _len = 2 * len; _v = new T[_len]; } template Vector::Vector(int len, T value) { _used = len; _len = 2 * len; _v = new T[_len]; for (int i = 0; i < _len; i++) { _v[i] = value; } } template T Vector::get(int a) const { try { if (a >= 0 && a < _used) return _v[a]; else throw "Error: Get vector data out of range!\n"; } //异常处理 catch (const char *msg) { std::cout << msg; return 0; } } template T& Vector::operator[](int a) { try { if (a >= 0 && a < _used) return _v[a]; else throw "Error: Request vercor data out of range!\n"; } //异常处理 catch (const char *msg) { std::cout << msg; return 0; } } template T Vector::put(int a, T value) { //若不够,就扩容 while (a > _used - 1) { _used++; adjust(); } _v[a] = value; } template void Vector::expandTo(int a) { while (a > _used - 1) { _used++; adjust(); } } template void Vector::expand() { int old_len = _len; _len = _len << 1; T *p = new T[_len]; for (int i = 0; i < old_len; i++) p[i] = _v[i]; delete[] _v; _v = p; } template void Vector::shrink() { _len = _len >> 1; T *p = new T[_len]; for (int i = 0; i < _used; i++) p[i] = _v[i]; delete[] _v; _v = p; } template void Vector::adjust() { if (((double)_used / (double)_len) < 0.25) shrink(); else if (((double)_used / (double)_len) > 0.75) expand(); return; } #endif