6 STL-vector
重新系统学习c++语言,并将学习过程中的知识在这里抄录、总结、沉淀。同时希望对刷到的朋友有所帮助,一起加油哦!
生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦!
写在前面,本篇章主要介绍STL中常用容器vector。
1.1 vector的基本概念
vector数据结构和数组非常相似,也称为单端数组。
vector与普通数组的区别:
数组是静态空间,而vector可以自动动态扩展空间。
什么叫动态扩展?
- 并不是在原空间后继续增大新空间
- 而是找大更大的内存空间,然后将原数据拷贝到新空间,并释放原空间。
vector特点:
- 前端封闭,不能进行插入和删除,通常在尾部进行插入和删除。push_back()插入,pop_back()删除。
- v.begin()指向第一个元素位置,v.end()指向最后一个元素的下一个位置。
- v.rbegin()指向倒数第一个元素位置,v.rend()指向一个元素的前一个位置。
- 还提供很多其他接口,例如插入insert()、erase()删除等。
- 迭代器支持随机访问。可跳跃式访问,例如 it 指向迭代器,可以加n。
1.2 vector构造函数
函数原型:
- vector<T> v; //采用模板实现类实现,默认构造函数
- vector(v.begin(), v.end()); //将v[begin(), end())区间中的元素拷贝给本身。
- vector(n, elem); //构造函数将n个elem拷贝给本身。
- vector(const vector& vec); //拷贝构造函数。
示例:
1.3 vector赋值操作
函数原型:
- vector& operator=(const vector& vec); //重载等号操作符
- assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
- assign(n, elem); //将n个elem拷贝赋值给本身。
示例:
1.4 vector容量大小
函数原型:
- empty(); //判断容器是否为空
- capacity(); //容器的容量
- size(); //返回容器中元素的个数
- resize(int num); //重新指定容器长度为num,若容器变长,则以默认值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除。
- resize(int num, elem); //重新指定容器长度为num,若容器变长,则以elem值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除
注意:
- 若重新指定容器长度,若容器变长,则capacity()容器的容量和size()都会变长。
- 若后续又指定容器变短,则capacity()容器的容量不变,只有size()会变小。
- 只有size()可变大变小,capacity()容器的容量只会变大。
示例:
1.5 vector插入和删除
函数原型:
- push_back(ele); //尾部插入元素ele
- pop_back(); //删除最后一个元素
- insert(const_iterator pos, ele); //在迭代器指向位置pos插入元素ele
- insert(const_iterator pos, int count, ele); //在迭代器指向位置pos插入count个元素ele
- erase(const_iterator pos); //删除迭代器指向pos位置的元素
- erase(const_iterator start, const_iterator end); //删除迭代器[start,end)之间的元素,左闭右开
- clear(); //删除容器中所有元素
erase(v.begin(), v.end()); 与clear()效果一样,都是清空数据。
示例:
1.6 vector数据存取
函数原型:
- at(int idx); //返回索引idx所指的数据
- operator[]; //返回索引idx所指的数据
- front(); //返回容器中第一个数据元素
- back(); //返回容器中最后一个数据元素
示例:
1.7 vector互换容器
函数原型:
swap(v); 将两个vector容器互换
实际用途:
巧用swap可以收缩内存空间。
示例:
1.8 vector预留空间
作用:
减少vector动态扩展容量的次数,提升性能。
函数原型:
reserve(int len); // 容器预留len个元素长的容量,预留位置的元素不会被初始化,元素不可访问。
使用时机:
如果知道数据量很大,就可以先使用reserve来预留空间。
示例: