• vector的介绍使用及模拟实现


    目录

    一、vector的介绍

    二、vector的使用

    1.vector的定义

    2.vector iterator 的使用

    3.vector 空间增长问题

    4.vector 增删查改

    5.vector模拟实现


    一、vector的介绍

    vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

    二、vector的使用

    1.vector的定义

    构造函数声明
    接口说明
    vector()
    无参构造
    vector size_type n, const value_type& val = value_type()
    构造并初始化 n val
    vector (const vector& x);
    拷贝构造
    vector (InputIterator fifirst, InputIterator last);
    使用迭代器进行初始化构造

    2.vector iterator 的使用

    iterator 的使用
    接口说明
    begin+end
    获取第一个数据位置的 iterator/const_iterator , 获取最后一个数据的下一个位置
    iterator/const_iterator
    rbegin+rend
    获取最后一个数据位置的 reverse_iterator ,获取第一个数据前一个位置的
    reverse_iterator

    3.vector 空间增长问题

    容量空间
    接口说明
    size
    获取数据个数
    capacity
    获取容量大小
    empty
    判断是否为空
    resize
    改变 vector size
    reserve
    改变 vector 放入 capacity

    4.vector 增删查改

    vector 增删查改
    接口说明
    push back 
    尾插
    pop back
    尾删
    find
    查找
    insert   
    position 之前插入 val
    erase
    删除 position 位置的数据
    swap
    交换两个 vector 的数据空间
    operator[]
    像数组一样访问

    5.vector模拟实现

    1. #include <iostream>
    2. //#include <vld.h>
    3. using namespace std;
    4. namespace bite
    5. {
    6. template<class T>
    7. class vector
    8. {
    9. public:
    10. typedef T* iterator;
    11. typedef const T* const_iterator;
    12. vector() :_start(nullptr), _end(nullptr), _finish(nullptr)
    13. {
    14. }
    15. vector(int n,const T &v = T()) :_start(nullptr), _finish(nullptr), _end(nullptr)
    16. {
    17. reserve(n);
    18. while (n--)
    19. push_back(v);
    20. }
    21. template<class inputiterator>
    22. vector(inputiterator first, inputiterator last):_start(nullptr), _finish(nullptr), _end(nullptr)
    23. {
    24. reserve(last - first);
    25. while (first != last)
    26. {
    27. push_back(*first);
    28. first++;
    29. }
    30. }
    31. vector(const vector<T>& v):_start(nullptr), _finish(nullptr), _end(nullptr)
    32. {
    33. reserve(v.capacity());
    34. iterator dest = _start, src = v._start;
    35. for (int i = 0; i < v.size(); i++)
    36. *dest++ = *src++;
    37. }
    38. ~vector()
    39. {
    40. delete _start;
    41. _start = _finish = _end = nullptr;
    42. }
    43. void push_back(const T &v)
    44. {
    45. insert(end(), v);
    46. }
    47. void pop_back()
    48. {
    49. erase(end()-1);
    50. }
    51. size_t size()const
    52. {
    53. return _finish - _start;
    54. }
    55. size_t capacity()const
    56. {
    57. return _end - _start;
    58. }
    59. //扩充容量
    60. void reserve(size_t n)
    61. {
    62. if (n > capacity())
    63. {
    64. T* newstart = new T[n];
    65. int oldsize = size();
    66. memcpy(newstart, _start, sizeof(T) * oldsize);
    67. delete _start;
    68. _start = newstart;
    69. _finish = _start + oldsize;
    70. _end = _start + n;
    71. }
    72. }
    73. void resize(size_t n,const T &x = T())
    74. {
    75. if (n <= size())
    76. {
    77. _finish = _start + n;
    78. return;
    79. }
    80. if (n > capacity())
    81. {
    82. reserve(n);
    83. iterator p=_finish;
    84. _finish = _start + n;
    85. while (p != _finish)
    86. {
    87. *p++ = x;
    88. }
    89. }
    90. }
    91. T& operator[](size_t pos)
    92. {
    93. return _start[pos];
    94. }
    95. const T& operator[](size_t pos)const
    96. {
    97. return _start[pos];
    98. }
    99. iterator begin()
    100. {
    101. return _start;
    102. }
    103. const_iterator begin()const
    104. {
    105. return _start;
    106. }
    107. iterator end()
    108. {
    109. return _finish;
    110. }
    111. const_iterator end()const
    112. {
    113. return _finish;
    114. }
    115. iterator insert(iterator it, const T& x = T())
    116. {
    117. if (_end == _finish)
    118. {
    119. //扩容
    120. size_t offset = it - _start; //偏移量
    121. size_t newcapacity = capacity() == 0 ? 1 : capacity() * 2;
    122. reserve(newcapacity);
    123. //扩容成功后,it会失效,需要重新赋值
    124. it = _start + offset;
    125. }
    126. iterator pos = _finish;
    127. while (pos != it)
    128. {
    129. *pos = *(pos - 1);
    130. pos--;
    131. *it = x;
    132. _finish++;
    133. }
    134. return it;
    135. }
    136. iterator erase(iterator it)
    137. {
    138. _finish--;
    139. iterator p = it;
    140. while (p != _finish)
    141. {
    142. *p = *(p + 1);
    143. p++;
    144. }
    145. return it;
    146. }
    147. private:
    148. iterator _start;
    149. iterator _end;
    150. iterator _finish;
    151. };
    152. };
    153. int main()
    154. {
    155. bite::vector<int> v;
    156. cout << "size=" << v.size() << endl;
    157. cout << "capacity=" << v.capacity() << endl;
    158. v.reserve(10);
    159. cout << "size=" << v.size() << endl;
    160. cout << "capacity=" << v.capacity() << endl;
    161. v.insert(v.begin(), 3);
    162. cout << "size=" << v.size() << endl;
    163. cout << "capacity=" << v.capacity() << endl;
    164. for (i = 0; i <= 5; i++)
    165. v.push_back(i);
    166. }

  • 相关阅读:
    c#中工厂模式详解
    GAN的理论知识及公式的理解
    免费版Typora的使用
    智能电表的功率计算方式是一样的吗?
    uniapp的 picker 日期时间选择器
    【Unity入门计划】基本概念(8)-瓦片地图 TileMap 01
    QGraphicsView自定义游标【解决修改光标样式不起作用】
    ASUS华硕灵耀X2 Duo UX481FA(FL,FZ)_UX4000F工厂模式原装出厂Windows10系统
    Linux常用命令
    【杂记】Windows首页挟持病毒查杀过程记录
  • 原文地址:https://blog.csdn.net/weixin_53032617/article/details/126400733