数据结构_顺序表_C++_STL_vector类常用函数小记

前言

一开始刷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++中对应的数据结构库。看懂原理并用熟,形成一套标准用法,比自己重复构造数据结构,效率高太多了。
后续还会对应更新。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值