本篇文章之所以诞生,是由于在刷PAT时需要掌握STL模板库,所以特意测试学习了常用的方法。仅适用于G++环境下的单线程单文档情况。对于多文档多线程情况不保证正确性。如果你是只想在数据结构与算法比赛中多拿一些AC而学习STL,小码农自认它还是挺好的。如果是项目需要而学习STL,还是建议读官方文档。
如果你觉得博文状态下阅读费劲,可以去我的github下载源码。如果出现对不齐的情况,把编辑器Tab键缩进设置成4个就可以了。欢迎指点评论。
#include <bits/stdc++.h>
using namespace std;
/*
下面的注释:
1)DT : data type
2)遍历说明:以集合名开头的都是遍历本次测试使用到的集合的结果,
由于太多cout会使调理不清晰,便直接放上输出结果。
*/
bool cmp(int e1, int e2){ return e1 > e2; }
int main()
{
/*
1、创建:
1)默认创建: vector<DT> v1;
2)创建时初始化大小为n: vector<DT> v2(n);
测试得到的初始值: int -> 0; char -> 0(ASCII);
double -> 0; float -> 0;
string -> ""; bool -> false;
3)创建时初始化大小为n,数据初始值为m: vector<DT> v3(n, m);
4)创建一个vector的拷贝: vector<DT> v4(ano);
5)创建一个拷贝指定区间的vector: vector<DT> v4(iterator it1, iterator it2);
迭代器类似一个游标,首位置在首元素之前,尾位置在尾元素之后,
每次移动将游标移至两元素之间。取出迭代器之后紧邻的元素使用 *,如 *it
*/
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 4);
vector<int> v4(v3);
vector<int> v5(v3.begin(), v3.end());
/*
2、基础操作(最最常用的操作):
向尾部插入: void push_back(data);
弹出最后一个元素: void pop_back();
vector中数据的个数: int size();
1)有多少就是多少,不管用没用,都会被计入size中。
1)比如第二种初始化方式,初始化之后的size就是传入的参数
取出指定位置的元素: DT at[index]; DT operator[index];
*/
v1.push_back(1);
/*Console: v1: 1
v2: 0 0 0 0 0 0 0 0 0 0
v3: 4 4 4 4 4 4 4 4 4 4
v4: 4 4 4 4 4 4 4 4 4 4
v5: 4 4 4 4 4 4 4 4 4 4 */
v1.pop_back();
v2.pop_back();
/*Console: v1:
v2: 0 0 0 0 0 0 0 0 0 */
/*
3、获取:
获取指定位置的元素: DT at[index]; DT operator[index];
获得首元素位置之前的迭代器: vector<DT>::iterator begin();
获得尾元素位置之后的迭代器: vector<DT>::iterator end();
获得头元素的拷贝: DT front();
获得尾元素的拷贝: DT back();
*/
for(int i = 0; i < 10; i++)
v1.push_back(i);
vector<int>::iterator itb3 = v1.begin();
vector<int>::iterator ite3 = v1.end();
int f = v1.front();
int b = v1.back();
cout << *itb3 << " " << *ite3 << " " << f << " " << b << endl;
/*Console: 0 0 0 9 */
/*
4、遍历:
直接遍历: for(int i = 0; i < v.size(); i++)
迭代器遍历: for(vector<DT>::iterator it = v.begin(); it != v.end(); it++)
1)可以对迭代器直接使用++和--,使游标向后或向前移动一位
*/
for(int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << endl;
for(vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
cout << *it << " ";
cout << endl;
/*Console: v1: 0 1 2 3 4 5 6 7 8 9
v1: 0 1 2 3 4 5 6 7 8 9 */
/*
5、插入:
插入到此vector最尾: void push_back(DT data);
向迭代器现在指向的位置和后面紧邻的位置之间插入一个x: iterator insert(iterator it, DT x);
向迭代器现在指向的位置和后面紧邻的位置之间插入n个x: iterator insert(iterator it, int n, DT x);
*/
vector<int>::iterator itb5 = v1.begin();
v1.insert(itb5, 99);
v1.insert(itb5, 100);
vector<int>::iterator ite5 = v1.end();
v1.insert(ite5, 999);
v1.insert(ite5, 9999);
/*Console: v1: 99 100 0 1 2 3 4 5 6 7 8 9 9999 999 */
itb5++;
v1.insert(itb5, 4, 98);
/*Console: v1: 100 98 98 98 98 99 0 1 2 3 4 5 6 7 8 9 9999 999 */
/*
6、删除:
删除最后一个元素: void pop_back();
删除迭代器游标之后紧邻的元素: iterator erase(iterator it);
1)迭代器游标已指向尾元素之后时运行时会出错
清空向量中所有元素: void clear();
*/
vector<int>::iterator itb6 = v1.begin();
v1.pop_back();
v1.erase(itb6);
v2.clear();
/*Console: v2:
v1: 98 98 98 98 99 0 1 2 3 4 5 6 7 8 9 9999 */
/*
7、修改:
把vector设置成 n个 x: void assign(int n, DT x);
交换两个同类型vector: void swap(vector&);
*/
v2.assign(8, 100);
v2.swap(v3);
/*Console: v2: 4 4 4 4 4 4 4 4 4 4
v3: 100 100 100 100 100 100 100 100 */
/*
8、排序:
使用sort()函数: sort(v.begin(), v.end());
需要自定义时传入比较函数: cmp(DT e1, DT e2);
*/
sort(v1.begin(), v1.end());
/*Console: v1: 0 1 2 3 4 5 6 7 8 9 98 98 98 98 99 9999 */
sort(v1.begin(), v1.end(), cmp);
/*Console: v1: 9999 99 98 98 98 98 9 8 7 6 5 4 3 2 1 0 */
/*
9、二维数组:
vector<vector<int> >
1)内部的vector<int>之后一定要有个space。不然会编译错误
*/
vector<vector<int> > vv;
vv.push_back(v1);
vv.push_back(v2);
/*Console: vv: 9999 99 98 98 98 98 9 8 7 6 5 4 3 2 1 0
4 4 4 4 4 4 4 4 4 4 */
/*
10、其他:
判断是否为空: bool empty();
反转vector中的元素: reverse(v.begin(), v.end());
*/
cout << v1.empty() << endl;
reverse(v1.begin(), v1.end());
/*Console: 0
v1: 0 1 2 3 4 5 6 7 8 9 98 98 98 98 99 9999 */
/*
11、补充:
创第5个构造函数中可以传入数组的一部分([begin, end)) :vector<int> v(&begin, &end);
*/
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> v11(&arr[3], &arr[8]);
/*Console: 4 5 6 7 8 */
return 0;
}