标准库类型vector表示对象的集合, 其中所有对象的类型都相同.
vector也常被称为容器(container).
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...) ; //错误
#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 //错误, 没有元素类型
#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; }