参考会长大佬https://me.csdn.net/m0_43448982
STL简介
STL简称标准模版库,被容纳在C++标准程序库,包含了许多基本数据结构和基本算法,使程序员写起来得心应手。
为什么使用STL
在学习数据结构的时候,在程序中会使用到堆、栈、队列、链表等一些基本的算法,而学习数据结构的时候,这些基本算法写起来十分繁琐,如果不想写这些,那么就可以考虑一下STL了。 但是不要太过于依赖STL!
STL基本概念
要使用STL,需要理解以下几个基本概念: 容器:是存放数据的地方,常见的容器有:链表(list) 栈(stack) 动态数组 (vector) 双端队列(deque) 队列(queue) 映射(map) **迭代器(iterator)**:可以理解为C语言里的地址,而迭代器就是容器的一个指针,十分重要!!! 算法:可以对容器里的数据做一些基本操作,比如排序,找最大元素等等。
STL使用前的初始化
==C++==: 1.需要对应的头文件,比如list就需要##include<list>,且没有.h,或者恶心的万能头##include<bits/stdc++.h>。 2.添加std命名空间(using namespace std;)不加的话后面可以自己写一堆。。。
==java==: 1.需要import类,可以统一写成import java.util.*;
C++里STL基本容器详解
==cmp类==: 通过自定义cmp类来完成STL的更加自由的设置
1 | struct cmp { |
==sort==: 1.需要头文件##include<algorithm>; 2.复杂度为O(nlogn),比较排序的极限了。
1 | bool cmp(int a, int b) |
sort里第一个参数是数组需要排序的第一个地址,第二个参数是数组需要排序的第二个地址,都三个参数是一个自定义函数,对数组排序的函数,上面的cmp函数是使数组元素从大到小排序。
sort是不稳定排序,即对于相同的值,无法保证其前后顺序 解决办法: 1、增加一个 index 变量,在值相同的使用比较 index 值的大小 2、使用 stable_sort
==vector==: 1.需要头文件##include<vector> 2.不定数组
1 | vector<int> a, b; |
==list==: 1.需要头文件##include<int> l; 2.双向链表
1 | list<int> l; |
==string==: 1.伪字符串; 2.定义:string s; 3.只能流输入和流输出;
1 | string a, b; |
==queue==: 1.需要头文件##include<queue>; 2.先进先出(内部为链表实现)
1 | queue<int> q; |
==stack==: 1.需要头文件##include<stack>; 2.后进先出(内部为数组实现)
1 | stack<int> q; |
==pair==: 1.需要头文件##include<map> 2.表示一组键对(有两个变量的结构体)
1 | pair<int, string> p; |
pair与其他结构嵌套
1 | vector<pair<int, string> > vp; |
==set==: 1.需要头文件##include<set>; 2.set保存了不可重复的元素–二叉搜索树-红黑树
1 | set<int> s; |
·由于set是红黑树,所以满足以下内容 1、内部有序(默认从小到大) 2、没有重复值,如果出现重复值会不断被覆盖 3、几乎所有操作复杂度均为 O(logN) 4、不可以修改节点上的值 5、修改操作只能进行插入和删除两个操作
set通常作用:保证唯一性,保证数列有序
==map==: 1.需要头文件##include<map>; 2.map字典(键对集合)——二叉搜索树——红黑树
1 | map<char, int> m; |
通常称map的first元素为key,second元素为value ·由于map是键对红黑树,所以满足以下内容 1、set的大部分性质; 2、key不能重复,不能修改,只能删除和添加; 3、允许value重复,可以对value进行修改; 4、map是按照key进行排序的; 5、key和value一定是成对出现的; 6、map的迭代器指向的内容是一个pair;
==priority_queue==: 1.需要头文件##include<queue> 2.优先队列–堆
1 | priority_queue<int> prq; |
·priority_queue默认为最大堆,即堆顶的元素最大 ·和queue一样,priority_queue不允许访问除了堆顶元素以外的任何一个元素。 ·priority_queue的插入和弹出操作的复杂度均为O(logN)
priority_queue功能与set接近,而且set的功能更强大,并且理论复杂度相同,为什么有时候反而就是用priority_queue? ·priority_queue的复杂度为最差情况下的复杂度,而set和map的复杂度均为稳定复杂度的极限值
Java里STL基本容器详解
参考https://blog.csdn.net/qq_38173003/article/details/79733423 https://www.cnblogs.com/solvit/p/9600591.html ==所有的容器都要有import类**import java.util.***==
==vector==: 和c++的vector使用方法类似。
1 | import java.util.*; |
==ArrayList==: Java.util.ArrayList类是一个动态数组类型,也就是说,ArrayList对象既有数组的特征,也有链表的特征。
1 | import java.util.*; |
==LinkedList==: LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
1 | import java.util.*; |
==HashSet==: 无重复元素
1 | import java.util.*; |
==HashMap==:
1 | import java.util.*; |
只做入门参考。
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2020/05/28/beginner-stl/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!