第二章 基本语言
第八节 vector类型介绍
1. vector类型简介
-
标准库:集合或者动态数组,我们可以把若干对象放在里边
-
vector能把其他对象装进来,也称为容器
#include <vector>
// 表示的是vint里边保存的是int型数据(int型对象)
vector<int> vint;
// <int>:模板, vector本身就是类模板,<int>实际上就是类模板的实例化过程
- vector 当成类型(残缺的类类型), vector:在vector之后加一对<>,<>内部放上类型信息,这样才算是完整的类类型
#include <iostream>
#include <string>
#include <vector>
struct student {
int num;
};
using namespace std;
int main() {
vector<student> stulist;
// 容器vector里面有都是一个vector<string>对象,集合套集合,用法可行
vector<vector<string>> vecVecStr;
// 往容器中装指针
vector<int *> vpoints;
// 引用是个别名,不是个对象,不是对象不能往容器中放,不可行
// vector<int &> vyinyong;
return 0;
}
2. 定义和初始化vector对象
- 空vector
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
// 创建了一个string类型的空的vector对象(容器),目前vStr里不包含任何元素
vector<string> vStr;
vStr.push_back("I AM");
vStr.push_back("Felaim");
return 0;
}
- 元素拷贝的初始化方式
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> vStr;
vStr.push_back("I AM");
vStr.push_back("Felaim");
// 把元素拷贝给了vStr1和vStr2
vector<string> vStr1(vStr);
vector<string> vStr2 = vStr;
return 0;
}
- c++11标准中,用列表初始化方法来给值,用{}括起来
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> vStr{"111", "hahha", "FELAIM"};
return 0;
}
- 创建指定数量的元素,有元素数量概念的对象一般会用()
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
// 创建15个int类型的元素,每个元素的值是99
vector<int> vint(15, 99);
vector<string> vstr(5, "LOVE");
vector<int> vint1(4);//定义4个元素,每个元素为0
vector<string> vstr1(5); //定义5个元素,每个元素都为空串
return 0;
}
- 多种初始化方式,()一般表示元素数量,{}一般表示元素内容,但不绝对
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<int> i1(10); //定义是10个元素,每个元素为0
vector<int> i2{10}; //定义一个元素,该元素值为10
vector<string> snor{"hello"};//一个元素, "hello"
vector<string> vs{10};//定义了10个空字符串
vector<string> vs1{10, "love"};//10个元素,都为"love"
vector<int> i3(10, 1);//10个元素都为1
vector<int> i4{10, 2};//两个元素,一个为10,一个为2,等同于初始化列表
// 要想正常的通过{}进行初始化,那么{}里边的值的类型,必须要跟vector后边这个<>里边元素类型相同
return 0;
}
3. vector对象上的操作
- 最常用的是不知道vector里有多少个元素,需要动态增加/减少,所以,一般来讲,先创建空vector
vector<int> vint;
- 判断是否为空empty(),返回的是布尔值
if (vint.empty()) {
cout << "vint is empty!" << endl;
} else {
cout << "vint is not empty!" << endl;
}
- push_back:常用方法,用于vector中的末尾增加一个元素
vint.push_back(1);
vint.push_back(99);
- size():返回元素个数
cout << "vint size is: " << vint.size() << endl;
- clear():移除所有元素,将容器清空
vint.clear();
- v[n]:返回v中的第n个元素,n代表位置,下标是从0开始的,下标不能越界
for (int i = 0; i < 10; i++) {
vint.push_back(i);
}
cout << vint[1] << endl;
- = 赋值
vint1 = vint;
- ==,!=:判断相等还是不相等,元素数量相同,对应位置的元素值也得相同
vector<int> vint2 = vint;
if (vint2 == vint) {
cout << "vint2 = vint !" << endl;
}
vint2.push_back(1);
if (vint2 != vint) {
cout << "vint2 != vint !" << endl;
}
vint.clear();
vint2.clear();
if (vint2 == vint) {
cout << "vint2 = vint !" << endl;
}
- 范围for的应用
vector<int> vint3{1, 4, 6, 7};
for (auto &v:vint3) {
v = v * v;
}
for (auto v:vint3) {
cout << v << " ";
}
cout << endl;
- 完整范例
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<int> vint;
if (vint.empty()) {
cout << "vint is empty!" << endl;
} else {
cout << "vint is not empty!" << endl;
}
vint.push_back(1);
vint.push_back(99);
if (vint.empty()) {
cout << "vint is empty!" << endl;
} else {
cout << "vint is not empty!" << endl;
}
cout << "vint size is: " << vint.size() << endl;
vint.clear();
cout << "vint size is: " << vint.size() << endl;
for (int i = 0; i < 10; i++) {
vint.push_back(i);
}
cout << vint[1] << endl;
vector<int> vint1;
vint1.push_back(12);
vint1 = vint;//vint1得到了10个元素,原来的元素被覆盖掉了
vint1 = {1, 3, 10};
cout << vint1.size() << endl;
vector<int> vint2 = vint;
if (vint2 == vint) {
cout << "vint2 = vint !" << endl;
}
vint2.push_back(1);
if (vint2 != vint) {
cout << "vint2 != vint !" << endl;
}
vint.clear();
vint2.clear();
if (vint2 == vint) {
cout << "vint2 = vint !" << endl;
}
vector<int> vint3{1, 4, 6, 7};
for (auto &v:vint3) {
v = v * v;
}
for (auto v:vint3) {
cout << v << " ";
}
cout << endl;
return 0;
}
3.1 范围for进一步讲解
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<int> vint3{1, 4, 6, 7};
// 第一次进入循环后,系统会记住vint3结束的位置, 如果vint3添加或删除元素
// 输出的值就会混乱
for (auto v:vint3) {
vint3.push_back(111);//导致输出混乱,无法控制
cout << v << " ";
}
cout << endl;
return 0;
}