就普通数组而言,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的基本创建方式,认识其大多数成员函数,相信我,用好vector,将会是你竞赛场上的一柄利器。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)