文章目录
一. 概念与底层
1.概念
vector是向量的意思。vector代表的是一个容器。
使用vector的时候记得包含头文件:#include<vector>
记得加命名空间std::
(因为vector在标准库里)
由tmplate可知,vector是一个模板。
vectors是序列容器,代表可以更改大小的数组
2.底层
我们可以先简单了解一下vector的底层。(与后面专门讲的稍有差异)
template<class T>
class vector
{
public:
private:
T* _arr; //这个是数组的指针,这是模板,数组的元素暂未确定
size_t _size;
size_t _capacity;
};
vector是一个模板,没有确定数组元素的类型
二. 构造与析构
size_type:用以保存任意string对象或vector对象的长度
value_type:stl容器盛装的数据的数据类型
#include<stdio.h>
#include<vector>
int main()
{
//无参构造
std::vector<int> v1;
//用10个1构造
std::vector<int> v2(10, 1);
return 0;
}
理解 std::vector<int> v1{ 1,2,3,4 };
linitializer_list
在此之前,先了解一下linitializer_list
,它也是一个容器
- 支持{}案例初始化这个容器
- 支持基本的迭代器(支持遍历)
- 不支持插删修(因为
const T*
)
the type of il is an initializer_list
il的类型是initializer_list
auto il = { 10, 20, 30 };
的底层:开一个数组,将值拷贝进去。
对象il里面有2个指针指向数组空间,一个指向数组的开始,一个指向数组的结束
vector<int> v1={1,2,3,4};
这个属于是隐式类型转换
{1,2,3,4}去构造一个vector的临时对象,再去拷贝构造。优化之后:直接构造
vector<int> v1({1,2,3,4});
auto il = { 10, 20, 30 };
或者显性地写:initializer_list il = { 10,20,30};
析构:
vector的析构是:释放底层动态开辟的数组资源
它的底层是有一个指针T* _arr;
,这个指针指向数组空间,在堆上,除了作用域就要就需要释放,所以调析构
三. 各种接口
遍历方式
在说接口之前,我们再回想一下,遍历容器的元素都有哪些方法呢?
3种:
- 普通循环遍历
- 迭代器(有通用性,任何容器的迭代器都是在他的类域里面)
- 范围for(支持迭代器,则支持fanweifor)
1.普通的循环遍历
#include<stdio