前言
一开始刷leetcode的时候,总忘记顺序表以及对应常用的算法的函数。导致百度都浪费不少时间。这次狠下心来,好好地整理一番,收藏到主页,需要用的时候直接复制粘贴对应函数代码,又好又快。
因为常见,也推荐好好记忆下来,以节约不少刷题时间。
资料
https://blog.csdn.net/kdjjdjdjjejje128/article/details/127546380
要点
STL 用的是C++的模板编程 和 函数重载。
代码分为几块:
构造方式,对应的数据结构的中增删改查的函数,遍历的写法,以及排序,查找,返回最大值等常用的函数。要用什么功能,找到代码对应的部分的函数,复制粘贴即可。
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
void vector_moxie(){
int a[] = { 1,5,72,72,18,18 };
//初始化方式
vector<int> v={12,6,4,1,3,4,5};//复制构造函数调用
vector<int> v1(a, a + 6);//使用数组初始化
vector<int> v2(v.begin(), v.end());//可以取范围初始化
vector<int>* v3 = new vector<int>(v1);//如果是new,则是返回指针。这里使用v1对v3进行初始化
vector<int> v4(10, 1);//初始化10个元素,赋值为1
vector<int> v5;
v5 = v;//赋值构造函数
vector<int>({ 0,57,18,5 });//匿名方式,适合临时构造一个vector
//取值方式
cout<<v[0]<<endl;//直接index索引
cout << v.at(0) << endl;//同为索引
cout << *v.begin() << endl;//v.begin()返回的是iterator。通过迭代器来取对应的值
//遍历方式
for (int i = 0; i < v.size(); i++) cout << v[i];//类似数组的方式直接调用
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) cout << *it;//通过迭代器调用
for (auto x = v.begin(); x != v.end(); x++) cout << *x; //可以
for (auto x = v.rbegin(); x != v.rend(); x++) cout << *x; //反向迭代器,逆序输出
for (auto x : v) cout << x; //for逐个访问v中的元素,但是不能赋值修改,只是单纯读数很方便
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); //打印到cout中,结果12 6 4 1 3 4 5
//动态的修改顺序表中的值
v[0] = 0;//索引修改
*(v.begin()+3) = 4;//使用迭代器修改
v.push_back(12);//尾部添加元素12,不是双端队列,不能从前面添加和删除
v.pop_back();//尾部删除
v.insert(v.begin() + 1, 2);//使用迭代器去对应位置插入元素
vector<int>::iterator it = v.begin() + 4;
it = v.insert(it, 5);//由于插入后,原先的it迭代器失效了,因此需要再用返回的新迭代器重新给it赋值。
it = v.erase(it);//删除it指向的元素,由于失效,同样需要重新赋值
v4.clear();//清空整个顺序表
v.empty();//判断是否为空
//常用算法,添加algorithm头文件才有用
sort(v1.begin(), v1.end());//排序,默认降序。大的在前
sort(v2.begin(), v2.end(), less<int>()); //加上仿函数less,则为增序,小的在前
count(v.begin(), v.end(), 12);//计数12出现的几次
find(v.begin(), v.end(), 12);//从头到尾,找到12第一次出现的位置,返回迭代器,暴力查找,O(n)复杂度
find_first_of(v.begin(), v.end(), v5.begin(), v5.end());//查找子序列,返回第一次出现的位置。如果是类型是vector<char>,则是字串匹配
find_end(v.begin(), v.end(), v5.begin(), v5.end());//查找子序列,返回最后一次出现的位置
auto it_pair=equal_range(v.begin(),v.end(),12);//二分查找,应用在有序上,返回等于12的元素的开头和结尾两个迭代器,以pair形式返回
it_pair.first;//第一个
it_pair.second;//最后一个
search(v.begin(), v.end(), v5.begin(), v5.begin() + 1);//从头到尾查找子序列v5[0]~v5[1],返回第一个找到的子序列的迭代器
search_n(v.begin(), v.end(), 12, 2);//找连续2个12的子序列
auto max_it=max_element(v.begin(),v.end());//返回最大元素的迭代器
auto min_it = min_element(v.begin(), v.end());//返回最小元素的迭代器
reverse(v.begin(), v.end());//将容器逆序
lower_bound(v.begin(),v.end(),12);//查找大于等于1d2的元素,返回它的迭代器。从第一个找起,找到就不往后找了,没找到就返回v.end()
upper_bound(v.begin(), v.end(), 12);//查找大于的。与上面都是找大于的,只是没有等于。用的二分查找,所以用在有序顺序表中
binary_search(v.begin(), v.end(), 12);//应用上面两个函数,判断是否12存在,二分搜索,故应用有序顺序表上,返回bool值
}
关于STL的使用感想
在学数据结构的时候,老师讲的大多数是原理。写和考试也是伪代码。导致,每次需要解决一道简单的算法题目,都需要自己去现场实现,比如排序。比如顺序表应该怎么构造。但事实上,比起自身构造,早有对应的库可以方便调用了,它们的水平也比我们高的多。直接使用他们的,将节约不少时间。STL stantard template library 标准模板库便是c++中对应的数据结构库。看懂原理并用熟,形成一套标准用法,比自己重复构造数据结构,效率高太多了。
后续还会对应更新。