C++ STL学习笔记: Vector
读研一年,惊觉找工作的急迫性,决定提前布局,开始刷题。但是发现自己对C++的STL库都没有很好的掌握,决定通过做题来按照重要性的优先级进行学习,准备一系列笔记,首先需要掌握的就是vector的基本用法。
对Vector的基本认知
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
- 注意其与array的区别。唯一区别在于array是空间运用方面array需要预先分配空间大小,并且无法改变,而vector是可以动态扩缩的。
- vector可以存放任意类型的数据
- vector是顺序容器
Vector的使用
创建
std::vector<int> first; // 构造一个没有元素的空容器std::vector<int> second(2, 10); // 2个值为10的整数std::vector<int> third(second.begin(), second.end()); // 迭代器构造std::vector<int> fourth(third); // 拷贝构造std::vectir<int> list = {1,2,3,4,5}; // 列表初始化
1.实参是函数调用时的实际参数值,形参是函数声明和定义时指定的参数名称。
2.实参和形参在函数实际调用时通过值传递方式发生联系,形参未调用时并不会分配空间和赋值,当调用时会分配空间,并且实参拷贝赋值给形参变量(值传递),实参值等于形参值。
3.函数内部只能访问形参值完成计算,无法直接访问实参。
4.函数调用结束后,形参占用的内存空间被释放,函数返回,实参仍然保留原来的内存空间和值。
访问
接口名称 | 用例 |
[ ] | |
at ( ) | |
vector<int>::iterator迭代器 | |
for循环 | |
back | 返回容器中最后的一个元素的引用,输出即为元素值 cout << v.back() << endl; |
front | 返回容器中第一个元素的引用 |
容量
容量空间 | 接口说明 |
size | 返回容器中真实存在的元素个数 |
capacity | 返回分配的空间容量大小 |
resize(size) | 调整容器的真实元素大小(size),直接访问会赋值默认0 |
reserve(size) | 调整容器的容量大小(capacity),直接访问会报错 |
empty | bool,判断容器是否为空 |
实际测试下来:
reserve部分编译器也不会报错,比如在线编译器在线编译器 – C/C++、Java、Python... | Techie Delight
比如这个:
#include <iostream>
#include <vector>
using namespace std;
using std::vector;
int main(void)
{vector<int> v;std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;v.reserve(10);cout<<v[9]<<endl;std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;v.resize(10);v.push_back(0);cout<<v[2]<<endl;std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;return 0;
}
输出是:
v.size() == 0 v.capacity() = 0
0
v.size() == 0 v.capacity() = 10
0
v.size() == 11 v.capacity() = 20
修改
方法 | 说明 |
push_back(elem) | 在末尾添加一个元素,有效元素个数加1 |
pop_back() | 删除最后一个元素,有效元素个数减1 |
insert(pos,num_to_insert,value) | 在指定迭代器位置的元素之前插入新元素来扩展容器,注意v.end()指向的是最后一个元素的后一个元素 |
erase | 从容器中删除单个元素,或一系列元素(迭代器区间[first,last]) |
swap | 交换两个容器的内容,不常用,就是互换全部的内容,只要类型相同 |
find | 查找(注意:这个是算法模块实现,不是vector的成员接口) |
二维Vector
创建
size1行 size2列,全部初始化为0
vector<vector<int>> table(size1, vector<int>(size2, 0));
//获取行列数
vector<vector<int>> a(r, vector<int>(c));//没有初值默认为0
int row = a.size(); //获取行数
int column = a[0].size(); //获取列数vector<vector<int>> new_mat(r);//注意这个r是不可缺少的,规定其有多少行
for(int i=0 ;i<r; i++) //二维vector的初始化时有要求的
{new_mat[i].resize(c);
}
修改
insert(pos,elem),类似的a.erase(a.begin() + 2, a.begin() + 3);//删除a的第二列for (int i = 0; i < a.size(); i++){a[i].erase(a[i].begin() + 2, a[i].begin() + 3);}