C++:渴望力量吗,少年?
文章目录
- 一、vector是什么?
- 二、vector的使用
- 1. 构造函数
- 2. vector iterator
- 3. vector 空间增长问题
- 4. vector增删查改
- 三、vector实际使用
一、vector是什么?
vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
注意:使用vector需要包含头文件 < vector >
二、vector的使用
1. 构造函数
函数名称 | 功能说明 |
---|---|
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); (重点) | 拷贝构造 |
vector (InputIterator first, InputIterator last); | 使用迭代器进行初始化构造 |
2. vector iterator
iterator的使用 | 接口说明 |
---|---|
begin + end(重点) | 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator /const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator |
3. vector 空间增长问题
容量空间 | 接口说明 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
resize(重点) | 改变vector的size |
reserve (重点) | 改变vector的capacity |
4. vector增删查改
函数名称 | 功能说明 |
---|---|
push_back(重点) | 尾插 |
pop_back (重点) | 尾删 |
find | 查找并返回位置 |
insert | 在position之前插入val |
erase | 删除position位置的数据 |
swap | 交换两个vector的数据空间 |
operator[ ] (重点) | 可以像数组一样访问 |
三、vector实际使用
代码如下:
#include<iostream>
#include<vector>using namespace std;void test_vector1()
{cout << "我是 test_vector1()" << endl;vector<int> v1;vector<int> v2(10, 0);//内容是10个0vector<int> v3(v2.begin(), v2.end());//可以用迭代器初始化string str("hello world");vector<int> v4(str.begin(), str.end());//也可以用其他容器的迭代器初始化vector<int> v5(v4);//拷贝构造//遍历for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << " ";//运算符重载}cout << endl;//vector<int>::iterator it = v4.begin();auto it = v4.begin();//迭代器遍历while (it != v4.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v5)//范围for遍历(本质上还是迭代器){cout << e << " ";}cout << endl;cout << endl;
}void test_vector2()
{cout << "我是 test_vector2()" << endl;size_t sz;vector<int> v;//v.reserve(55);//1可以提前将空间设置足够,就可以避免边插入边扩容导致效率低下的问题了sz = v.capacity();cout << "making v grow:\n";for (int i = 0; i < 100; ++i)//查看扩容的具体数据{v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}//vs下使用的STL基本是按照1.5倍方式扩容cout << endl;
}void test_vector3()
{cout << "我是 test_vector3()" << endl;vector<int> v1;cout << v1.max_size() << endl;//没啥用vector<int> v;//v.reserve(100); // size = 0 capacity 100v.resize(100); // size = 100 capacity 100for (size_t i = 0; i < 100; i++){v[i] = i;//如果是注释上面的v.resize(100),取消对v.reserve(100)的注释仍会报错//虽然空间是开出来了,但是因为这个运算符重载包含对下标的断言,超过size就报错}for (auto e : v){cout << e << " ";}cout << endl;cout << endl;
}void test_vector4()
{cout << "我是 test_vector4()" << endl;vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (auto e : v){cout << e << " ";}cout << endl;v.insert(v.begin(), 0);//和string一样,效率不高,不建议经常使用for (auto e : v){cout << e << " ";}cout << endl;auto it = find(v.begin(), v.end(), 3);//在首尾之间找数字3并返回下标if (it != v.end()){v.insert(it, 30);//在3前面插入30}for (auto e : v){cout << e << " ";}cout << endl;it = find(v.begin(), v.end(), 3);if (it != v.end()){v.erase(it);//删除元素}for (auto e : v){cout << e << " ";}cout << endl;cout << "Before clear:" << endl;cout << v.size() << endl;cout << v.capacity() << endl;v.clear();//清除内容,容量还在cout << "After clear:" << endl;cout << v.size() << endl;cout << v.capacity() << endl;v.shrink_to_fit();//缩容至合适的容量,不怎么使用cout << "After shrink_to_fit:" << endl;cout << v.size() << endl;cout << v.capacity() << endl;cout << endl;
}int main()
{test_vector1();test_vector2();test_vector3();test_vector4();return 0;
}
vector的使用和string差不多,其余操作可以自行查阅或者参考之前的文章:
String类(上)
String类(中)