因为平常用的话只是vector的一些非常简单的功能,基本上把它当数组来用,现在也只是把这一部分写了一些。
1 template<class T>
2 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<T&>(operator[](index));
36 return const_cast<T&>((static_cast<const XVector<T>&>(*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函数需要承担的风险。
Algorithm | Vector,布布扣,bubuko.com
时间: 2024-10-09 22:14:16