vector 容器
1. vector 是同一种类型对象的集合,每个对象在集合中都有一个对应的整数索引值;
vector是一个模板类;
vector对象的重要属性就在于可以在运行时高效地添加元素;因为vector增长的效率高,在元素值已知的情况下,最好是动态添加元素;
2. vector对象初始化
vector<T> v1; // vector保存类型为T的对象,默认构造函数v1为空;
vector<T> v2(v1); //vector保存类型为T的对象,v2为v1的副本;
vector<T> v3(n, i); // vector保存类型为T的对象,v3中含有n个元素,每个元素的初始化值为i;
vector<T> v4(n); // vector保存类型为T的对象, v4中含有n个元素,系统自动调用T类型的默认构造函数;
const int ARRAY_SIZE = 10; int array[ARRAY_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //定义数组; vector<int> v(array, array + ARRAY_SIZE); //用数组对Vector容器进行初始化操作; v(p1, p2): p1,p2为数组中地址; p2为末尾地址,不取值
vector<int> v(array + 3, array + 5) //vector容器中初始化值为: 4, 5;共两个元素;
3. vector 接口
vector<int> v; int i = 0; v.empty(); //是否为空,返回bool类型; v.size(); //返回集合元素个数; Attention: 返回类型不为整数值; 返回类型为 vector<int>::size_type // vector<string> v1; v1.size() 返回类型为 vector<string>::size_type; //不返回unsigned整数值的原因为:使代码独立于平台; v.push_back(i); //在v的末尾添加 整数i ; push 压入 v.pop_back(); // 将v的末尾项弹出(删除); pop弹出 v[i]; //下标运算; 获取索引为i的项; 对于多维容器 vector< vector<int> > vv1,同样可以使用 vv1[i][j]获取元素; //仅能对确定已存在的元素进行下标运算,下标运算不能新增元素;
4. 迭代器4.1 一般迭代器
迭代器 (iterator) , 是一种检查容器内元素并遍历元素的数据类型;
vector<T> 容器的迭代器: vector<T>::iterator iter
vector定义了begin()和end()函数,用于返回迭代器; begin()返回的迭代器指向第一元素;
迭代器使用“解引用操作符(*操作符)”来访问迭代器所指向的元素; 使用自增操作符(++)向后移动迭代器指向容器中下一个元素;
可以通过一般迭代器对容器中的元素进行修改操作;
vector<int> v; v.push_back(0); v.push_back(1); v.push_back(2); for(int i = 0; i != v.size(); i++) { cout<<v[i]<<" ";} for(vector<int>::iterator iter = v.begin(); iter != v.end(); iter++) { cout<<*iter<<" ";}
4.2 只读迭代器const_iterator 只读迭代器;
vector<int>::const_iterator iter1; //只读迭代器, 迭代器指向元素值不能修改, 迭代器指向的位置可以更改; iter1 ++; //ok *iter1 = 1 ; //error const vector<int>::iterator iter2; //常量迭代器, 迭代器指向元素值可被修改,迭代器指向的位置不能更改; iter2++; //error *iter2 = 1; //ok
5. 二唯容器
const int SIZEI = 2; const int SIZEJ = 3; //定义二维容器 vector<vector<int>> v1; //输入 for(int i = 0; i < SIZEI; i++) { vector<int> tempV; //定义一维容器进行初始化 for (int j = 0; j < SIZEJ; j++) { tempV.push_back(j); //v1[i][j] 是不能进行新增操作的;不能用v1[i][j] = j的方式进行初始化; } //因为v1[i][j]只是一个取值操作,并不会申请地址; v1.push_back(tempV); tempV.clear(); } //输出1 for(int i = 0; i < SIZEI; i++) { for (int j = 0; j < SIZEJ; j++) { cout<<v1[i][j]<<" "; } cout<<endl; } //输出2 for(vector<int>::size_type i = 0; i < v1.size(); i ++) { for(vector<int>::iterator vi = v1[i].begin(); vi != v1[i].end(); vi++) { cout<<*vi<<" "; } cout<<endl; } //输出3 for(vector<vector<int>>::iterator vi = v1.begin(); vi != v1.end(); vi++) { for(vector<int>::iterator vj = (*vi).begin(); vj!=(*vi).end(); vj++) { cout<<*vj<<" "; } cout<<endl; }