c++ vector基本知识
vector介绍
标准库类型vector表示对象的集合, 其中所有对象的类型都相同.
vector也常被称为容器(container).
vector是一个类模板.
因为引用不是对象, 所以不存在包含引用的vector.
在遍历vector对象时, 循环体中不能改变该vector对象的大小.
数组与vector类似, 区别是:
数组大小固定, 不能向数组中增加元素, 数组性能较好, 但损失了灵活性.
vector初始化
//#include <vector>
//using std::vector;
vector<int> ivec; //保存int类型的对象
vector<vector<string>> file; //vector元素是vector对象, 可以认为是二维vector.
//初始化vector的方法
vector<T> v1 ; //声明一个空vector, 执行默认初始化
vector<T> v2(v1) ; //v2包含v1所有元素的副本
vector<T> v3 = v1 ; //等价于v3(v1)
vector<T> v4(n, val) ; //v4包含n个重复的元素, 每个元素值都是val
vector<T> v5(n) ; //v5包含n个重复的元素, 每个元素值都是初始化对象, int的初始值为0, sting的初始值为空串""
vector<T> v6{a,b,c...} ; //v6, 使用一组值初始化
vector<T> v7={a,b,c...} ; //v7, 等价于v7{a,b,c...}
//使用花括号的是列表初始化,
//使用圆括号的是值初始化,
vector<int> v1(8) ; //v1有8个元素, 每个的值都是0;
vector<int> v2{8} ; //v2有1个元素, 该元素的值是8;
vector<int> v3(8, 1) ; //v3有8个元素, 每个的值都是1;
vector<int> v4{8, 1} ; //v4有2个元素, 值分别是8, 1;
vector<string> v5{"hi"} ; //v5有1个元素, 列表初始化
vector<string> v6("hi") ; //错误, 值初始化第一个参数不能是字符串字面值
//当使用{}, 但又无法执行列表初始化时, 编译器会尝试进行值初始化
vector<string> v7{10} ; //v7有10个元素, 因为10与string类型不匹配, 无法执行列表初始化, 所以编译器进行了值初始化.
vector<string> v8{10, "hi"}; //v8有10个元素, 因为10与string类型不匹配, 无法执行列表初始化, 所以编译器进行了值初始化.
vector<T> v6(a,b,c...) ; //错误
操作vector
#include <vector>
using std::vector;
vector<int> v1 ; //空vector对象
v1.push_back(9) ; //向尾端添加一个元素9. 添加元素不能用下标, 会报告不存在这个下标.
v1.empty() ; //v1是否为空(不含有任何元素)
v1.size() ; //v1中元素的个数
v1[n] ; //返回第n个元素的引用, 下标必须合法, 否则报错.
v1 = v2 ; //用v2中的元素拷贝替换v1中的元素
v1 = {a,b,c...} ; //用列表中的元素拷贝替换v1中的元素
v1 == v2 ; //v1和v2的元素个数相同, 且对应位置的元素值相同
<, <=, >, >= ; //以字典顺序进行比较
//遍历vector
vector<int> v{1,2,3,4,5,6,7,8,9} ;
for(auto &i:v) //i是个引用,
i *= i; //改变i会改变原vector
for(auto i:v) //i是临时变量
cout << i << endl;
//vector的size_type要包含元素类型
vector<int>::size_type //正确
vector::size_type //错误, 没有元素类型
使用多维vector
#include <iostream>
#include <string>
#include <vector>
int main()
{
using std::cout;
using std::endl;
using std::string;
using std::vector;
vector<vector<string>> a(2); //二维vector, 第一维有两个元素
//给第二维追加元素
a[0].push_back("00"); //a[0][0]
a[0].push_back("01"); //a[0][1]
//a[1][0], a[1][1], a[1][2], a[1][3]
a[1].push_back("10"); //a[1][0]
a[1].push_back("11"); //a[1][1]
a[1].push_back("12"); //a[1][2]
a[1].push_back("13"); //a[1][3]
//给第一维再追加元素, 注意v_tmp的类型必须是vector<string>
vector<string> v_tmp;
a.push_back(v_tmp);
a[2].push_back("20"); //a[2][0]
a[2].push_back("21"); //a[2][1]
a[2].push_back("22"); //a[2][2]
//遍历, 使用iterator
for(auto it0=a.begin(); it0!=a.end(); it0++)
{
//使用distance获取两个iter的距离, 相当于当前idx, 如果第一个参数大, 则返回负值
cout << "" << distance(a.begin(), it0) << endl;
//使用it0->begin()获取第二维vector的开头
for(auto it1=it0->begin(); it1!=it0->end(); it1++)
{
//使用*it1得到第二维的值
cout << " " << distance(it0->begin(), it1) << ": " << *it1 << endl;
}
}
//遍历, 使用下标, 下标类型为对应vector的size_type
for(vector<vector<string>>::size_type i=0; i<a.size(); i++)
{
cout << "" << i << endl;
for(vector<string>::size_type j=0; j<a[i].size(); j++)
{
cout << " " << j << ": " << a[i][j] << endl;
}
}
return 0;
}