引子
一天,苦力怕接到一个朋友说他要去逛街,要我帮他写个程序,每次他买了个东西,就让程序记下来,最后再把他买的所有东西的价格输出来,看看他有没有搞错。
就是这个简单的问题,难倒了一个又一个C++初学者,用数组呢,又不知道开多大,伤透了脑筋。
在这个时候
我们的神器vector出场了。
神马是vector
vector是一个STL的容器,准确说是一个模板,不过模板这玩意儿你们不知道,也不用知道,反正我们不用写,用现成的就行了。^_^
vector在标准教材《C++primer》里被称为向量,但是我觉得叫动态数组更恰当,俗称如意金箍棒。
所以vector到底是个啥呢?
其实啊,它就是一个长度可变的数组,可长可短,非常nice。
vector的各种操作
首先,因为vector是STL里的,所以需要头文件,别忘了把它包含进去哦
#include <vector>
初始化
因为vector是一个模板,也就相当于说着它能驾奴所有的类型,甚至包括我们自己定义的struct,class
这也就意味着vector在定义的时候就要告诉它里面放的是个啥
接下来我就列举几种初始化的方式
代码形式 | 作用 |
vector<X> x1 | 创建一个X类型的空vector |
vector<X> v1(v2) | 创建一个X类型的vector v2的副本 |
vector<X> v1 = v2 | 同上一个 |
vector<X> v1 (n, dat) | 创建一个X类型的拥有n个dat元素的vector |
vector<X> v1 (n) | 创建一个X类型的拥有n个默认初始值的元素 |
vector<X> v1 = {a, b...} | 创建一个X类型初始值为列表中的vector |
vector<X> v1{a,b...} | 同上一个 |
如表所示,虽然vector初始化的方式有7种,但是其实最常用的还是第一种,至于元素基本上手动加还更不容易错,至于后面几个大家了解下就可以了。
各种函数
vector有几个函数给我们调用,接下来苦力怕再用一张表来总结一下
名称 | 作用 |
v.push_back(x) | 在v的末尾添加一个值为x的元素 |
v.size() | 返回v的大小 |
v.empty() | 返回一个bool,当v为空时为true,否则为false |
v.resize(n, t) | 把v变成一个长度为n, 每个元素为t的vector |
不是很多,对吧。^_^
对了,忘记说了
vector可以像数组那样用下标访问
比如这样
cout << v[3] << endl;
当然如果vector的大小都没有达到下标会报错的哦
其他
关于vector的比较问题,有一点争议
但是其实很简单,判断等不等于就是判断两个vector分别位置上的数值相不相等,
至于大于小于的话,就是按字典序 (不知道字典序是啥的可以上网搜一下)
还有就是关于迭代器,迭代器定义强烈建议用auto,要不然光一个类型会把你写吐的。
vector的迭代器支持begin(), end(),以及+=, -=操作,具体操作就不再废话了。
引子做法
我们只需要开一个vector来记录他买的东西的价格,最后再把整个vector遍历一遍输出就行了
代码:
#include <iostream>
#include <vector> // 注意不要漏了
using namespace std;
int main() {
vector<int> things; // 传说中的vector
int t; // 用来存储价格
while (cin >> t) {
things.push_back(t); // 加入操作
}
for (int i : things) { // 范围for循环,C++11新特性
cout << i << endl;
}
return 0;
}
今天苦力怕就讲到这里咯,再见。^_^