小言_互联网的博客

c++---vector的使用和模拟实现

487人阅读  评论(0)

目录

目录

目录

一、接口介绍

二、实现

三、测试用例

四、迭代器失效


一、接口介绍

1、插入数据

void push_back(const T& x)

        在当前vector尾部插入x,如果容量不够扩大二倍。

iterator insert(iterator pos, const T& x)

       在POS位置插入元素x

2、容量相关

size_t capacity()

        返回当前vector的容量(size+剩余容量)

size_t size()

        返回当前vector的元素个数

void resize(size_t n, const T& val = T())

        改变当前vector的size,如果n>size则大于部分初始值为val。(capacity的大小始终保持不变)

void reserve(size_t n)

        改变当前vector的capacity,如果n<capacity则不改变。

3、删除数据

void pop_back()

        如果vector不为空,删除当前vector的最后一个元素

iterator erase(iterator pos)

       删除POS位置的元素

4、运算符重载

T& operator[](size_t pos)

        []运算符重载,支持使用下标访问vector

二、实现


  
  1. #include<iostream>
  2. #include<string.h>
  3. #include<assert.h>
  4. using namespace std;
  5. namespace myvector
  6. {
  7. template< class T>
  8. class vector
  9. {
  10. public:
  11. typedef T* iterator;
  12. iterator begin()
  13. {
  14. return start;
  15. }
  16. iterator end()
  17. {
  18. return finish;
  19. }
  20. //默认构造函数
  21. vector()
  22. :start( nullptr)
  23. , finish( nullptr)
  24. , end_of_storage( nullptr)
  25. {}
  26. //容量
  27. size_t capacity()
  28. {
  29. return end_of_storage - start;
  30. }
  31. size_t size()
  32. {
  33. return finish - start;
  34. }
  35. void reserve(size_t n)
  36. {
  37. if (n > capacity())
  38. {
  39. //开新空间
  40. T* tmp = new T[n];
  41. //拷贝旧空间的内容
  42. memcpy(tmp, start, sizeof(T)*size());
  43. //改变容量
  44. finish = tmp + size();
  45. end_of_storage = tmp + n;
  46. //释放旧空间
  47. T* tmp1 = start;
  48. start = tmp;
  49. tmp = nullptr;
  50. }
  51. }
  52. void resize(size_t n, const T& val = T())
  53. {
  54. //判断容量
  55. if (n > capacity())
  56. reserve(n);
  57. //如果n<size
  58. if (n < size())
  59. {
  60. finish = start + n;
  61. }
  62. else
  63. {
  64. while (finish != start + n)
  65. {
  66. *finish = val;
  67. finish++;
  68. }
  69. }
  70. }
  71. //检查空间
  72. void check_capacity()
  73. {
  74. if (finish == end_of_storage)
  75. {
  76. //如果当前不为空,就扩2倍,为空就开4个吧
  77. size_t newcapacity = finish == nullptr ? 4 : capacity()* 2;
  78. reserve(newcapacity);
  79. }
  80. }
  81. T& operator[]( size_t pos)
  82. {
  83. assert(pos < size());
  84. return start[pos];
  85. }
  86. //插入
  87. void push_back(const T& x)
  88. {
  89. insert(finish,x);
  90. }
  91. iterator insert(iterator pos, const T& x)
  92. {
  93. assert(pos >= start && pos <= finish);
  94. size_t pos1 = pos - start;
  95. check_capacity();
  96. //解决迭代器失效
  97. pos = start + pos1;
  98. //移动数据
  99. iterator end = finish;
  100. while (end >= pos)
  101. {
  102. *(end + 1) = *end;
  103. end--;
  104. }
  105. //插入数据
  106. *pos = x;
  107. finish++;
  108. return pos;
  109. }
  110. //删除数据
  111. void pop_back()
  112. {
  113. assert(finish > start);
  114. finish--;
  115. }
  116. iterator erase(iterator pos)
  117. {
  118. assert(pos >= start && pos < finish);
  119. iterator it = pos + 1;
  120. while (it != finish)
  121. {
  122. *(it - 1) = *it;
  123. ++it;
  124. }
  125. --finish;
  126. return pos;
  127. }
  128. //析构函数
  129. ~ vector()
  130. {
  131. delete[] start;
  132. start = finish = end_of_storage = nullptr;
  133. }
  134. private:
  135. iterator start;
  136. iterator finish;
  137. iterator end_of_storage;
  138. };
  139. }

三、测试用例


  
  1. void test1()
  2. {
  3. //测试默认构造和析构函数
  4. myvector:: vector< int> v1;
  5. }
  6. void test2()
  7. {
  8. //测试push_back()、reserve、check_capacity、size、capacity
  9. myvector:: vector< int> v2;
  10. //插入至少五个数据,进行一次扩容,扩容间接对size和capacity以及check_capacity进行了测试
  11. v2.push_back( 1);
  12. v2.push_back( 2);
  13. v2.push_back( 3);
  14. v2.push_back( 4);
  15. //v2.push_back(5);
  16. for ( size_t i = 0; i < v2.size(); i++)
  17. cout << v2[i] << " ";
  18. cout << endl;
  19. //测试resize,变小变大
  20. v2.resize( 8, 6);
  21. for ( size_t i = 0; i < v2.size(); i++)
  22. cout << v2[i] << " ";
  23. cout << endl;
  24. v2.resize( 4);
  25. //测试[]
  26. //正常访问
  27. for ( size_t i = 0; i < v2.size(); i++)
  28. cout << v2[i] << " ";
  29. cout << endl;
  30. //越界访问
  31. //cout << v2[v2.size()] << endl;
  32. //cout << v2[-1] << endl;
  33. //测试insert---将push_back使用insert插入也可以进行检查
  34. myvector:: vector< int>::iterator it = v2.begin();
  35. it = v2.insert(it, 0);
  36. it = v2.insert(it + 2, 10);
  37. for ( size_t i = 0; i < v2.size(); i++)
  38. cout << v2[i] << " ";
  39. cout << endl;
  40. //测试删除
  41. v2.pop_back();
  42. v2.pop_back();
  43. for ( size_t i = 0; i < v2.size(); i++)
  44. cout << v2[i] << " ";
  45. cout << endl;
  46. v2.erase(v2.begin());
  47. for ( size_t i = 0; i < v2.size(); i++)
  48. cout << v2[i] << " ";
  49. cout << endl;
  50. }

四、迭代器失效

1、在vector的接口中,使用insert插入数据时可能导致迭代器失效,具体如下

2、删除操作导致迭代器失效

3、迭代器失效的解决办法

1)在vector中,解决迭代器失效的办法是在插入、删除等可能会导致迭代器失效的地方,返回新的迭代器来解决迭代器失效。


转载:https://blog.csdn.net/qq_47406941/article/details/115418977
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场