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_iterator
)rbegin
是从尾部开始的,遍历时是++,不是–
(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的快速入门常用接口的主要内容,如果未能解决你的问题,请参考以下文章