就普通数组而言,array不过是封装一个类的把戏罢了,只能称之为pro版数组;而对于vector来说,则是一台完美的重装坦克,升级为promax版数组,兼顾动态扩展和多种功能,成为算法竞赛上的常用数组容器。vector与前面两者不同,能够做到动态扩展,相比传统数组而言更加灵活。如果读者对array是否为动态数组而感到疑虑,则可自行跳转《千万别认为array容器是动态数组!》去一探究竟。vector又被称为向量数组,原因是因为vector能够迅速在尾部插入元素,即push_bakc(),其时间复杂度为O(1),不知道啥是O(n)的可以去了解一下《时间复杂度”-衡量算法效率的核心指标》,其高效的原因也很简单,有指针维护一个末尾元素呗!接下来我将带领读者创建vector容器。
#include<bits/stdc++.h> /* vector是普通数组的promax版 */ using namespace std; /*vector容器创建方式*/ void test() { vector<int> v1;//指定数据类型后直接创建 vector<int> V2(5,0);//通过构造函数,创建有5个0元素的容器 vector<float> v3(5);//直接指定长度,默认元素是0填充,char类型是"\0"空格填充 ,类的话是调用其默认构造函数 vector<int> v4{1,2,3,4,5} ;//直接构建,类似普通数组一样 vector<int> v5(v4);//怎么能忘记深拷贝呢 vector<int> v6=v4;//这也是一种深拷贝 /*运算符'='重载也别忘了*/ vector<int> v7; v7=v4; } int main(){ test(); return 0; }
通过注释为读者解释了各种创建vector的方式,感觉怎么样,是不是对vector的掌握力更自信了!
当然,学东西不能只学一半,vector内有许多有用且高效的成员函数也是值得让人一探究竟,下面我为读者展示c++11后vector的成员函数,然后说一些通用、实用的方法。
函数 | 说明 |
---|---|
at(size_type pos) | 返回 pos 位置元素的引用,有边界检查 |
back() | 返回最后一个元素的引用 |
begin() | 返回指向第一个元素的迭代器 |
cbegin() | 返回指向第一个元素的 const 迭代器 |
cend() | 返回指向末尾的 const 迭代器 |
crbegin() | 返回指向最后一个元素的 const 反向迭代器 |
crend() | 返回指向开头前一个位置的 const 反向迭代器 |
capacity() | 返回当前分配的存储容量 |
clear() | 清除所有内容 |
data() | 返回指向底层数组的指针 |
empty() | 检查容器是否为空 |
end() | 返回指向末尾的迭代器 |
erase(const_iterator pos) | 删除 pos 处的元素 |
erase(const_iterator first, const_iterator last) | 删除范围 [first, last) 的元素 |
front() | 返回第一个元素的引用 |
get_allocator() | 返回相关的分配器 |
insert(const_iterator pos, const T& value) | 在 pos 前插入 value |
insert(const_iterator pos, size_type count, const T& value) | 在 pos 前插入 count 个 value |
insert(const_iterator pos, InputIt first, InputIt last) | 在 pos 前插入迭代器范围 |
insert(const_iterator pos, initializer_list<T> ilist) | 在 pos 前插入初始化列表 |
max_size() | 返回可容纳的最大元素数 |
pop_back() | 删除最后一个元素 |
rbegin() | 返回指向最后一个元素的反向迭代器 |
rend() | 返回指向第一个元素前一个位置的反向迭代器 |
reserve(size_type new_cap) | 增加容器的容量 |
resize(size_type count) | 改变元素数量,默认构造新元素 |
resize(size_type count, const T& value) | 改变元素数量,用 value 初始化新元素 |
size() | 返回元素数量 |
swap(vector& other) | 交换内容 |
问题描述:用户组织在dotcpp.com网站上进行比赛,他们的成绩分别是{67, 88, 45, 92, 34, 76, 89, 23, 91, 55},首先先放vector里,然后完成以下操作:
1.把元素放容器里
2.在第三个位置插入一个新成绩 90
3.删除最后一个成绩
4.修改第二个成绩为 95
5.检查vector是否为空,并输出当前学生人数
6.获取第一个和最后一个成绩
7.使用迭代器遍历并输出所有成绩
8.清空所有成绩
9.再次检查是否为空
写完以后可以和我对比一下:
#include<bits/stdc++.h> /* vector是普通数组的promax版 */ using namespace std; /*小刀试牛 看看你对vector的掌控力*/ void test() { /*1*/ vector<int> v{67, 88, 45, 92, 34, 76, 89, 23, 91, 55} ; /*2*/ v.insert(v.begin()+2,90); cout <<"插入后第三个元素变成"<< v[2] << '\n'; /*3*/ v.pop_back(); cout<< "最后一个竞赛者的成绩已经被删除了"<<'\n' ; /*4*/ v.at(2)=95; cout <<"修改后第2个元素变成"<< v[2] << '\n'; /*5*/ if(!v.empty()) cout<< "检测到当前元素非空"<<'\n'; cout << "当前元素容量为" << v.size() << '\n'; /*6*/ cout<< "第一个元素是" << v.front() << '\n'; cout<< "最后一个元素是" << v.back() << '\n'; /*7*/ cout << "通过迭代器遍历所有元素" << '\n'; for(vector<int>::iterator it = v.begin();it!=v.end();++it) { cout << *it << " "; } cout << '\n'; /*8*/ v.clear(); cout << "完成容器清空" << '\n'; /*9*/ if(v.empty())cout << "当前容器已清空" << '\n'; } int main(){ test(); return 0; }
结果也是不出所料!
总结:我们总体了解了vector的基本创建方式,认识其大多数成员函数,相信我,用好vector,将会是你竞赛场上的一柄利器。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程