常用库函数及STL自我汇总(待完善)
参考runoob.com,《算法竞赛进阶指南》,https://oi-wiki.org/
最近在做一些csp题目的时候,发现对stl和库函数中的很多东西不太熟悉,所以通过自我总结来复习巩固知识。
1,vector
注意事项:
[1]:是一种能够存放任意类型的动态数组,完全可以替代普通数组,支持随机访问;
[2]:顺序容器,并非链表,不支持在任意位置O(1)插入元素,元素增删一般在容器末尾进行。
声明:
// 1. 创建空vector; 常数复杂度
vector<int> v0;
// 2. 创建一个初始空间为3的vector,其元素的默认值是0; 线性复杂度
vector<int> v1(3);
// 3. 创建一个初始空间为3的vector,其元素的默认值是2; 线性复杂度
vector<int> v2(3, 2);
// 4. 创建一个初始空间为3的vector,其元素的默认值是1,
// 并且使用v2的空间配置器; 线性复杂度
vector<int> v3(3, 1, v2.get_allocator());
// 5. 创建一个v2的拷贝vector v4, 其内容元素和v2一样; 线性复杂度
vector<int> v4(v2);
// 6. 创建一个v4的拷贝vector v5,其内容是{v4[1], v4[2]}; 线性复杂度
vector<int> v5(v4.begin() + 1, v4.begin() + 3);
// 7. 移动v2到新创建的vector v6,不发生拷贝; 常数复杂度; 需要 C++11
vector<int> v6(std::move(v2)); // 或者 v6 = std::move(v2);
// 8. 创建一个ve,其内容是map<int,int> mp的所有元素
vector<pair<int,int>>ve(mp.begin(),mp.end());
// 9. 创建一个二维数组,其中第一维长度为n,第二维长度为m
vector<vector<int>> ve(n,vector<int>(m));
常用方法:
元素访问:
- reference operator[]:ve[x]访问ve中下标为x的引用,不执行越界检查
- reference v.front():返回首元素的引用,可以直接在对首元素进行修改,比如v.front()*=2;
- reference v.back():返回尾元素的引用
- iterator v.begin():返回向量头指针,指向第一个元素
- iterator v.begin():返回向量尾指针,指向向量最后一个元素的下一个位置
- bool empty(),int size():分别判断是否为空和返回向量中元素的个数
- v.clear():清除所有元素
- v.push_back():在末尾插入元素:由于vector是顺序容器,要在末尾进行元素的添加和删除,所以有个_back(),注意区别
- v.pop_back():删除末尾元素
2,array
注意事项:
[1],array是内存连续的,固定长度的数据结构,本质是对原生数组的直接封装。
声明:
//定义长度为3内容为{1,2,3},类型为int的数组
array<int,3>a{1,2,3};
常用方法:
1.a.front():返回第一个元素
2.a.back():返回最后一个元素
3,accumulate
头文件:#include
使用方法:
1.对容器内元素累加求和:
int sum=accumulate(v.begin(),b.end(),0);
2.对容器内元素进行自定义处理: