就普通数组而言,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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程