• 简单重写容器vector


      1 #pragma once
      2 #include <iostream>
      3 using namespace std;
      4 
      5 template<class T>
      6 class CMyVector
      7 {
      8 public:
      9     CMyVector() { buff = NULL; len = maxSize = 0; }
     10     ~CMyVector() { _clear(); }
     11     size_t capacity();
     12     size_t size();
     13     bool empty();
     14     void print();
     15     //迭代器
     16     struct MyIterator
     17     {
     18         T* pt;
     19         MyIterator() { pt = NULL; }
     20         MyIterator(MyIterator& it) { pt = it.pt; }
     21         ~MyIterator() { pt = NULL; }
     22         MyIterator operator=(const MyIterator& it) {
     23             pt = it.pt;
     24             return *this;
     25         }
     26         bool operator!=(const MyIterator& it) {
     27             return (pt != it.pt);
     28         }
     29         T operator*() {
     30             return (*pt);
     31         }
     32         MyIterator& operator++() {
     33             ++pt;
     34             return *this;
     35         }
     36         MyIterator operator++(int) {
     37             MyIterator tmp = *this;
     38             ++pt;
     39             return tmp;
     40         }
     41         MyIterator operator+(int n)const {
     42             MyIterator tmp;
     43             tmp.pt = pt + n;
     44             return tmp;
     45         }
     46         int operator-(const MyIterator& it)const {
     47             return (pt - it.pt);
     48         }
     49         MyIterator operator-(int n) {
     50             MyIterator tmp;
     51             tmp.pt = pt - n;
     52             return tmp;
     53         };
     54     };
     55 
     56     MyIterator begin()
     57     {
     58         MyIterator tmp;
     59         tmp.pt = buff + 0;
     60         return tmp;
     61     }
     62     MyIterator end()
     63     {
     64         MyIterator tmp;
     65         tmp.pt = buff + len;
     66         return tmp;
     67     }
     68 
     69     T operator[](size_t pos) {
     70         return *(buff + pos);
     71     }
     72 
     73     void push_back(T t);
     74     void insert(const MyIterator& it, T t);
     75     void insert(const MyIterator& it, const MyIterator& first, const MyIterator& last);
     76     void assign(const MyIterator& first, const MyIterator& last);
     77     T at(size_t pos);
     78 private:
     79     T* buff;
     80     size_t len;
     81     size_t maxSize;
     82 
     83     void _clear();
     84 };
     85 
     86 template<class T>
     87 void CMyVector<T>::push_back(T t)
     88 {
     89     if (len >= maxSize)
     90     {
     91         maxSize += ((maxSize >> 1) > 1) ? (maxSize >> 1) : 1;
     92         T* tmp = new T[maxSize];
     93         if (buff)
     94         {
     95             memcpy(tmp, buff, sizeof(T)*len);
     96             delete[] buff;
     97         }
     98         buff = tmp;
     99     }
    100     buff[len++] = t;
    101 }
    102 
    103 template<class T>
    104 void CMyVector<T>::insert(const MyIterator& it, T t)
    105 {
    106     int pos = it - begin();
    107     if (pos > (int)len)
    108         return;
    109 
    110     if (len >= maxSize)
    111         maxSize += ((maxSize >> 1) > 1) ? (maxSize >> 1) : 1;
    112 
    113 
    114     T* tmp = new T[maxSize];
    115     if (buff) {
    116         memcpy(tmp, buff, sizeof(T)*pos);
    117         tmp[pos] = t;
    118         memcpy(tmp + pos + 1, buff + pos, sizeof(T)*(len - pos));
    119         delete[] buff;
    120     }
    121     else
    122         tmp[pos] = t;
    123     buff = tmp;
    124     ++len;
    125 }
    126 
    127 template<class T>
    128 void CMyVector<T>::insert(const MyIterator& it, const MyIterator& first, const MyIterator& last)
    129 {
    130     int pos = it - begin();
    131     if (pos > (int)len)
    132         return;
    133 
    134     int count = 0;
    135     if ((count = last - first) <= 0)
    136         return;
    137 
    138     while ((len + count) >= maxSize)
    139         maxSize += ((maxSize >> 1) > 1) ? (maxSize >> 1) : 1;
    140 
    141 
    142     T* tmp = new T[maxSize];
    143     if (buff) {
    144         memcpy(tmp, buff, sizeof(T)*pos);
    145         for (int i = 0; i < count; ++i)
    146             tmp[pos + i] = *(first + i);
    147 
    148         memcpy(tmp + pos + count, buff + pos, sizeof(T)*(len - pos));
    149         delete[] buff;
    150     }
    151     else
    152         for (int i = 0; i < count; ++i)
    153             tmp[pos + i] = *(first + i);
    154 
    155     buff = tmp;
    156     len += count;
    157 
    158 }
    159 
    160 template<class T>
    161 void CMyVector<T>::assign(const MyIterator& first, const MyIterator& last)
    162 {
    163     _clear();
    164     insert(begin(), first, last);
    165 }
    166 
    167 template<class T>
    168 T CMyVector<T>::at(size_t pos)
    169 {
    170     return *(buff + pos);
    171 }
    172 
    173 template<class T>
    174 void CMyVector<T>::_clear()
    175 {
    176     if (buff)
    177         delete[] buff;
    178 
    179     buff = NULL;
    180     len = maxSize = 0;
    181 }
    182 
    183 template<class T>
    184 size_t CMyVector<T>::capacity()
    185 {
    186     return maxSize;
    187 }
    188 
    189 template<class T>
    190 size_t CMyVector<T>::size()
    191 {
    192     return len;
    193 }
    194 
    195 template<class T>
    196 bool CMyVector<T>::empty()
    197 {
    198     return (len == 0);
    199 }
    200 
    201 template<class T>
    202 void CMyVector<T>::print()
    203 {
    204     /*CMyVector<T>::MyIterator it;
    205     it = begin();
    206     while(it != end())
    207     cout << *it++ << " ";*/
    208     for (auto it = begin(); it != end(); ++it)
    209     {
    210         cout << *it << " ";
    211     }
    212     cout << endl;
    213 }
  • 相关阅读:
    非专业码农 JAVA学习笔记 3 抽象、封装和类(1)
    非计算机专业的码农C#学习笔记 三、变量 表达式 字符串
    非专业码农 JAVA学习笔记 2 java语言基础
    非计算机专业的码农C#学习笔记 五、数组和集合
    PSP个人软件开发工具
    端口映射
    $.proxy()
    input type=button设置高度不管用
    移动端日期控件
    mac终端下svn常用命令
  • 原文地址:https://www.cnblogs.com/xslwm/p/7966563.html
Copyright © 2020-2023  润新知