• 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. }

  • 相关阅读:
    mysql高阶语句
    【MySQL】 MySQL索引事务
    BI智慧工程行业应用方案丨文末获取三重资源包
    (翻译) CAP 理论 FAQ
    谷歌浏览器误代码STATUS_INVALID_IMAGE_HASH如何一行代码解决
    ParameterizedType类型设置默认值
    内置单片机的433无线模块高速连传典型运用
    工业RFID读写器选择指南
    flutter 应用 抓包
    Linux【安全 02】OpenSSH漏洞修复(离线升级最新版本流程)网盘分享3个安装包+26个离线依赖
  • 原文地址:https://blog.csdn.net/weixin_53032617/article/details/126400733