6-3-1:STL之vector——vector的快速入门常用接口

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6-3-1:STL之vector——vector的快速入门常用接口相关的知识,希望对你有一定的参考价值。

一:vector介绍

vector是一个可变大小数组的序列容器。和数组一样,vector也采用连续的空间来存储元素,也就是可以用下标对vector的元素进行访问,但是它又和数组不一样,因为它的大小可以动态可变,十分高效

在这里插入图片描述
可以发现它也是模板,需要注意的是它的第二个模板参数是一个内存池,是一种池化技术,主要是避免反复向操作系统申请空间,我们学习时这个参数可以不用管,因为它有默认参数

vector涉及的接口和string的接口基本相似,所以这里就大部分就不做细致讲解了,详见STL之string
在这里插入图片描述
需要注意的是vector作为类模板,它可以承载的数据有多种类型
在这里插入图片描述

二:vector的常用接口

(1)构造

在这里插入图片描述

vector():无参构造
在这里插入图片描述

vector(size_type n,const value& val=value_type()): 构造并初始化n个val

在这里插入图片描述
它的数据类型很广泛
在这里插入图片描述

vector(const vector& x); 拷贝构造
在这里插入图片描述
vector(inputlterator first.inputlterator last); 使用迭代器构造,范围是[first,last)

需要注意的构造时不止可以使用自己的迭代器,而且可以使用别的容器的迭代器
在这里插入图片描述
vector& operator= (const vector& x):赋值重载
在这里插入图片描述

(2)迭代器

基本用法
在这里插入图片描述
在这里插入图片描述
这里要注意反向迭代器(reverse_iteratorrbegin是从尾部开始的,遍历时是++,不是–
在这里插入图片描述

在这里插入图片描述

(3)容量操作

相比于reserve,vector更多使用的是resize

我们知道,vector可以理解为一个动态数组,当插入元素空间不够时会自动增容,在Windows几乎是增容1.5倍,在Linux下是2倍。所以如果能确定元素个数,尽量使用resize的方式初始化,相较于传统初始化,它更加节省空间
在这里插入图片描述

(4)元素访问

operator []:使用[]访问
在这里插入图片描述

在这里插入图片描述
那么下面这两种访问方式有什么区别呢?

vector<int> test(10,0);
int arr[10]={0};

test[i]=10;
arr[i]=10;

首先arr[i]是我们最熟悉的形式,因为在C语言中经常使用它,我们知道arr[i]等价于*(arr+i),也就是说这是一个指针运算和解引用的操作。而test[i]是在调用它的重载函数,也就是返回的是返回值对象的别名,之所以可以返回引用,是因为出了作用域后,那个对象还在(是在堆上开辟的第i个位置)

(5)增删查改

find:查找(注意它不属于vector的接口,是STL的算法模块)

find之所以不提供接口的原因是,几乎所有容器都需要find,因此将其独立在算法模块,这样传入只需传入容器的迭代器即可,返回时返回的也是迭代器

下面是find的实现,本质就是一种暴力查找

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}

可以见查找成功就返回的是第一次查找成功时的迭代器,查找失败返回的就是末尾的迭代器
在这里插入图片描述
insert:插入

他使用的也是迭代器
在这里插入图片描述
在这里插入图片描述
需要注意的是insert可能会导致迭代器失效的问题,因为insert时可能会涉及到空间增容问题,而迭代器本质就是一个指针,因此增容时可能vector已经开辟出了新的空间,而迭代器依旧指向旧的空间,成为了野指针

erase:清除元素

传入的也是迭代器,可以是某个迭代器对应位置的元素,也可以是一段迭代器区间
在这里插入图片描述

以上是关于6-3-1:STL之vector——vector的快速入门常用接口的主要内容,如果未能解决你的问题,请参考以下文章

STL之vector容器详解

STL之vector

C++中STL学习笔记——容器之vector

C++中STL学习笔记——容器之vector

STL之vector

STL之Vector