因为平常用的话只是vector的一些非常简单的功能,基本上把它当数组来用,现在也只是把这一部分写了一些。
1 template2 class XVector { 3 public: 4 XVector(int cacheSize):cacheSize(cacheSize), count(0) { 5 data = new T[cacheSize]; 6 } 7 XVector():cacheSize(100), count(0) { 8 data = new T[cacheSize]; 9 }10 11 ~XVector() { 12 delete[] data;13 }14 15 void push_back(T val) {16 if (count >= cacheSize) {17 cacheSize <<= 1;18 T* copy = new T[cacheSize];19 memcpy(copy, data, sizeof(T) * count);20 delete[] data;21 data = copy;22 }23 data[count++] = val;24 }25 26 void pop_back() {27 count--;28 }29 30 int size() const {31 return count;32 }33 34 T& operator[](int index) {35 //return const_cast (operator[](index));36 return const_cast ((static_cast &>(*this))[index]);37 }38 39 const T& operator[](int index) const {40 return data[index];41 }42 43 private:44 int count;45 int cacheSize;46 T *data;47 };
但是注意在用非const的operator[]函数调用const版本的operator[]函数时,应该先用static_cast强制将this转成const,这样才能调用到const版本的函数。这一个过程是安全的。然后再将返回的const T&去掉const,这个过程也是非const函数需要承担的风险。