目录
链接
1. vector的定义
2. vector的构造
3. vector 的遍历
4. vector 的扩容机制
5. vector 的空间接口
5.1 resize 接口
5.2 push_back
5.3 insert
5.4 erase
5.5 流插入与流提取
vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便
6. vector 的不同类型元素
链接
cplusplus.com/reference/vector/vector/https://cplusplus.com/reference/vector/vector/
1. vector的定义
(constructor)构造函数声明 | 接口说明 |
vector() | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构 造 |
2. vector的构造
//模版类只能显式实例化vector<int> v1;vector<int> v2(10, 1);//迭代器初始化vector<int> v3(v2.begin(), v2.end());vector<int> v4(++v2.begin(), --v2.end());
3. vector 的遍历
vector 与 string 的遍历相同,并且做了更多的优化
void test_vector1(){vector<int> v1;vector<int> v2(10, 1);vector<int> v3(++v2.begin(), --v2.end()); //下标遍历for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << " ";}cout << endl; //迭代器遍历vector<int>::iterator it = v3.begin();while (it != v3.end()){cout << *it << " ";++it;}cout << endl; // 范围 for 遍历for (auto e : v3){cout << e << " ";}cout << endl;}
4. vector 的扩容机制
vector 的扩容机制在 VS 环境下是1.5倍扩容,在 g++ 环境下是2倍扩容,和string相同
但是有一点不同:
那就是string 的 reverse 接口如果给出的值小于原来的容量那么就可能会缩容,但是 vector 的 reverse 接口如果给出一个小于原容量的值就不会缩容
void TestVectorExpend(){size_t sz;vector<int> v;sz = v.capacity();cout << "capacity changed :" << sz << "\n";cout << "make a grow" << endl;for (size_t i = 0; i < 100; i++){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed :" << sz << "\n";}}}
5. vector 的空间接口
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
resize | 改变vector的size |
reserve | 改变vector的capacity |
5.1 resize 接口
resize 接口是在原来 vector 对象的基础上进行添加数据
当然有两种情况:
一种是添加数据容量小于原来的size,就会减小size的值而不改变capacity的值(容量不变)
第二种情况就是大于size的值,就会根据给定的值来扩容
vector<int> v(10, 1);cout << v.size() << endl;cout << v.capacity() << endl;//小于sizev.resize(5, 2);cout << v.size() << endl;cout << v.capacity() << endl; //大于sizev.resize(15, 2);cout << v.size() << endl;cout << v.capacity() << endl;
void test_vector3(){ //10个整形数据1vector<int> v(10, 1); //申请20空间v.reserve(20);cout << v.size() << endl;cout << v.capacity() << endl; //10个整形数据1,补上5个整形数据2v.resize(15, 2);cout << v.size() << endl;cout << v.capacity() << endl; //10个整形数据1,5个整形数据2,补上10个整形数据3v.resize(25, 3);cout << v.size() << endl;cout << v.capacity() << endl; //只保留5个数据v.resize(5);cout << v.size() << endl;cout << v.capacity() << endl;}
通常 vector 支持迭代器插入
5.2 push_back
//尾插vector<int> v(10, 1);v.push_back(10);for (auto e : v){cout << e << " ";}cout << endl;
5.3 insert
//头插vector<int> v(10, 1);v.insert(v.begin(), 1);for (auto e : v){cout << e << " ";}cout << endl;//第一个数+3之后在第三个位置进行插入v.insert(v.begin() + 3, 1);for (auto e : v){cout << e << " ";}
5.4 erase
删除指定位置的数据
//头删vector<int> v(10, 1);v.erase(v.begin());for (auto e : v){cout << e << " ";}cout << endl;//第一个数+3之后删除第三个位置的数据v.erase(v.begin() + 3);for (auto e : v){cout << e << " ";}cout << endl;
5.5 流插入与流提取
vector 并不支持流插入与流提取,但是可以自己设计,更加灵活方便
vector<int> v(10);for (size_t i = 0; i < v.size(); i++){cin >> v[i];}for (auto e : v){cout << e << " ";}cout << endl;
6. vector 的不同类型元素
vector不光可以存储int,double类型,还可以存储日期类,string,自定义类型,甚至还可以存储vector(也就是存储二维数组)
vector<vector<int>>:二维数组存放整数类型
//二维数组 //5个元素的一维数组vector<int> v(5, 1); //开辟一个10行5列的二维数组vector<vector<int>> vv(10, v); vv[2][1]=1; //这两段代码的意思是相同的 //vv.operator[](2)operator[](1)=2;
遍历
//二维数组 //5个元素的一维数组vector<int> v(5, 1); //开辟一个10行5列的二维数组vector<vector<int>> vv(10, v);//使用下标遍历二维数组for (int i = 0; i < vv.size(); i++){for (int j = 0; j < v.size(); j++){cout << vv[i][j] << " ";}cout << endl;}
感谢观看~