[STL] 算法竞赛必备模块化工具库

目录

1.STL了解

    1.概念

     2.三大组件

     3.主要作用

      4.万能头文件

2.Vector(动态数组)

3.Pair(二元组)

4.String(字符串)

5.Queue(队列)

6.Priority_queue(优先队列)

   1.Sort函数+比较函数+运算符重载

    2.大根堆和小根堆

7.Stack(栈)

8.Deque(双向队列)

9.Set(集合)

10.Map(映射)

11.Unordered(哈希表)

12.Algorithm库函数

13.小结


1.STL了解

    1.概念

    STL(Standard Template Library)是 C++ 标准库的核心,通过泛型编程提供通用、高效的数据结构和算法。

     2.三大组件

        1.容器(Containers):存储数据的模板类,分为序列容器,关联容器和容器适配器.

        2.算法(Algorithms):操作数据的模板函数,与容器无关.

        3.迭代器(Iterators):泛型指针,连接容器与算法.

     3.主要作用

        1.直接用现成的工具,不用自己手动实现复杂的数据结构,可以专注于算法设计.

        2.算法库可以直接调用,不容易翻车而且时间复杂度有确切的保证.

      4.万能头文件
#include<bits/stdc++.h>

     比较耗时,可以加快输入输出速度

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

2.Vector(动态数组)

      1.头文件

#include<vector>

     2.初始化

#include<vector>
#include<algorithm>

vector<int> a;//表示空构建,不进行数据填充
vector<int>b(5, 0);//容器b中包含五个元素并且他们的值都是0 先声明的是容量
vector<int>h(5);//初始化五个大小  默认都为0
vector<int>k({1,2,3})//用于具体填充各个数据时,此时小括号和等于号的效用是一样的

vector<int>[200];//二维数组 记住200表示的是外层是200个vector
vector<vector<int>>arr;//二维数组

struct tac {
	int c;
	string d;
};
vector<tac>h;//结构体容器

vector<int>a(b.begin(),b.begin+3);//把b动态数组中的前三个数据赋值过来
	                              //记得迭代器要多往后一位 (左闭右开区间)
int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);//获取数组中的数据的时候,不要忘记数组名本身代表的就是第一个数据的地址
	                  //而且同样是左闭右开区间
    for(auto x : a) {//遍历输出 
        cout << x << " ";
    }


    3.获取长度

vec.size();

   4.改变数组大小

vector<int> vec({0,1,2,3,4,5});
vec.resize(2);//变成{0,1}

  5.检查容器是否为空

bool check=vec.empty();//空则返回true  否则false

  6.清空容器

vec.clear();

    也可以用erase函数进行特定元素数据的删除   

    时间复杂度O(n)  这里的n指的是删除元素后的元素数量  因为需要底层需要动态维护到前面(保证内存的连续性) 对n个数据进行操作

a.erase(it)//从a中删除迭代器it指定的元素,p必须指向c中的一个真实元素,不能是最后一个元素end()
a.erase(b,e)//从a中删除迭代器对b和e所表示的范围中的元素,返回e

     要注意函数处理的参数是迭代器

for (auto it = v.begin(); it != v.end();) {
    if (*it == 3) {
        it = v.erase(it);  // 必须接收erase的返回值!
    } else {
        ++it;
    }
}

    迭代器失效:原本指向的元素内存位置被移动或者删除了导致无法在该位置匹配,所以失效

    所以删除之后要立马记得更新迭代器 ,删除之后返回的迭代器位置是原本删除位置的下一位

7.迭代器相关

vector<int>::iterator it;//迭代器声明 不专属于具体的某个容器  
                         //使用作用域解析符 因为本质是vector类模板中的一部分
vec.begin();//指向第一个元素
vec.end();//指向最后一个元素的下一位

for (vector<int>::iterator it = a.begin();it != a.end();it++) {
	cout << *it << ' ';
	cout << endl;
}//一种遍历方式

for(auto &element:vec){
}//另一种遍历方式

    这里同样可以顺带熟悉一个函数reverse(翻转)    O(n)

vector<int> a={1,2,3,4,5};
reverse(a.begin(),a.end());//a的值为5,4,3,2,1  倒置

8.快速取双端元素

vec.front();//取最前面元素值
vec.back();//取最后面元素值

9.双端动态处理数组   

vec.push_back(a);//往末尾添加元素a
vec.pop_back();//删除末尾元素
//没有push_front()这个是双端队列deque的库函数  
//因为这个本质上会把数据都向后移一位  时间复杂度太高

   O(1) 

   当然这里也可以用insert函数进行操作 

// 初始化vector 
//记住前面的参数表示的是插入位置
    vector<int> vec = {2, 3, 4};

    // 1. 在最前端插入元素
    vec.insert(vec.begin(), 1);  // vec = {1, 2, 3, 4}

    // 2. 在指定位置(第3个元素前)插入单个元素
    vec.insert(vec.begin() + 2, 5);  // vec = {1, 2, 5, 3, 4}

    // 3. 插入多个相同元素
    vec.insert(vec.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值