【C++】vector的使用

慈云数据 2024-05-29 技术支持 26 0

在这里插入图片描述

🔥个人主页: Forcible Bug Maker

🔥专栏: STL || C++

目录

  • 前言
  • 🌈关于vector
  • 🔥默认成员函数![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2032f2c440544200a1ca636688707f61.png)
    • ==构造函数(constructor)==
    • ==析构函数(destructor)==
    • ==赋值运算符重载(operator=)==
    • 🔥迭代器接口
      • ==begin和end==
      • ==rbegin和rend==
      • ==cbegin,cend,crbegin和crend==
      • 🔥元素获取
        • ==operator[ ]重载,at访问,front获取首元素,back获取尾元素==
        • 🔥容量接口
          • ==size==
          • ==capacity==
          • ==reserve==
          • ==resize==
          • ==empty==
          • 🔥vector对象增删查改
            • ==push_back==
            • ==pop_back==
            • ==insert==
            • ==erase==
            • ==clear==
            • 结语

              前言

              本篇博客主要内容:STL库中vector的介绍以及vector用法的讲解。

              在string部分,我们讲了很大篇幅的内容,一部分原因是因为初次接触STL,当你理解一个时,就会发现其他的内容都是相通的;另一原因就是,string所提供的接口确实太多。

              本篇将要介绍和讲解的vector,算是string学习的奖励内容,它的本质是我们所实现的动态顺序表。动态顺序表的内容可以参考我之前写的初阶数据结构:初阶数据结构-顺序表和链表(C语言

              在C++中,一般不用数组,而使用vector。

              🌈关于vector

              在这里插入图片描述

              vector是表示可变大小数组的序列容器

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

              本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

              vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

              因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

              与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

              🔥默认成员函数在这里插入图片描述

              学vector,首先需要知道它都有什么构造,以及有什么样的赋值运算符重载。

              构造函数(constructor)

              在这里插入图片描述

              构造一个vector对象,可以使用以下四种方式对构造的对象初始化。

              default (1)

              explicit vector (const allocator_type& alloc = allocator_type());
              

              这是std::vector的默认构造函数。其创建了一个不含任何元素的空vector对象。可选参数alloc是一个分配器对象,用于指定内存分配模型(往后会展开,这里不用过于考究,大多数时候使用默认值即可)。

              其中explicit关键字阻止了隐式类型转换。

              fill (2)

              explicit vector (size_type n, const value_type& val = value_type(),
                               const allocator_type& alloc = allocator_type());
              

              构造一个含有n个val值的vector容器。

              alloc一般使用缺省值。

              explicit防止参数进行隐式类型转换。

              range (3)

              template 
                       vector (InputIterator first, InputIterator last,
                               const allocator_type& alloc = allocator_type());
              

              按迭代器区间[first,last)内容顺序构造vector对象。

              alloc参数一般使用缺省值。

              copy (4)

              vector (const vector& x);
              

              构造一个和x对象的拷贝。

              允许隐式类型转换。

              代码案例:

              #include
              #include
              using namespace std;
              int main()
              {
              	// 默认构造
              	vector v1;
              	// 填充构造
              	vector v2(10, 4);
              	for (int i = 0; i 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon