首页 > 其他分享 >STL学习指南

STL学习指南

时间:2023-11-07 21:55:16浏览次数:31  
标签:学习指南 初始化 begin iterator STL 元素 vector push

STL库指南

优先队列(priority_queue)

初始化

//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;

priority_queue<int> q;//默认大顶堆
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

自定义类型

struct cmp {
	bool operator()(pii a, pii b) {
		return a.fi>b.fi;
};
priority_queue<pii, vector<pii>, cmp> mi_hp;
#include <iostream>
#include <queue>
using namespace std;

//方法1
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大顶堆
    }
};

//方法2
struct tmp2 //重写仿函数
{
    bool operator() (tmp1 a, tmp1 b) 
    {
        return a.x < b.x; //大顶堆
    }
};

int main() 
{
    tmp1 a(1);
    tmp1 b(2);
    tmp1 c(3);
    priority_queue<tmp1> d;
    d.push(b);
    d.push(c);
    d.push(a);
    while (!d.empty()) 
    {
        cout << d.top().x << '\n';
        d.pop();
    }
    cout << endl;

    priority_queue<tmp1, vector<tmp1>, tmp2> f;
    f.push(c);
    f.push(b);
    f.push(a);
    while (!f.empty()) 
    {
        cout << f.top().x << '\n';
        f.pop();
    }
}

队列(queue)

初始化

queue<T> q;

内置方法

push();
//元素入队的push操作只是制造了该元素的一个副本入队,因此在入队后对原元素的修改不会影响队列中的副本,而队列中副本的修改也不会改变原元素,需要注意由此可能引入的bug(一般由结构体产生)。
pop();
size();
empty();
front();
back();

双端队列(deque)

初始化

#include<deque>
deque<int> dq;

内置方法

dq.push_back();
dq.push_front();

dq.push_back();
dq.push_front();

dq.front();
dq.back();

dq.pop_back();
dq.pop_front();

distance(d.begin(),it)//可以求出当前的迭代器指针it距离头部的位置

遍历方法

for(const auto& elem:dq){
	cout<<elem<<" ";
}

for(auto elem:dq){
	cout<<elem<<" ";
}

列表(vector)

初始化

vector<int> e;//一维
vector<vector<int>> e(n,vector<int>(n));//二维
vector<PII> e;
vector<vector<vector<int>>> a(N,vector<vector<int> >(m,vector<int>(k,0)));//三维
vector<vector<array<int,27>>> a(n,vector<array<int,27>>(m));
  //通过拷贝构造初始化
  vector<int> v2=v1;
  //使用部分元素构造
  vector<int> v3(v1.begin(),v1.begin()+1);

内置方法

【元素个数】

当容器A为空时,如果直接使用A.size()-1的话,会直接造成溢出,得到的结果并不是-1,而是一个很大的数。

所以为了避免发生溢出的情况,需要正确使用size方法。

e.size();//返回值类型为unsigned int型,unsigned int的取值范围为0~2^32 -1。
int size = e.size();//1
(int)e.size();//2

【添加元素】

e.emplace_back(1,1);//会执行构造函数
e.push_back(1);

【列表复制】

//1
vector<int> v1(v2);
//2
vector<int> v1;
v1.assign(v2.begin(),v2.end());

【删除元素】

//删除末尾元素
v1.pop_back();

//删除指定位置的一个元素或删除指定范围内的元素(迭代器)
v.erase( vec.begin() + 5 );//删除第6个元素
vec.erase( vec.begin(), vec.begin() + 3 );//删除第1个元素,到第4个元素 

【遍历元素】

//正向迭代器
(vector<int>::iterator it=v.begin();i!=v.end();i++){
	cout<<*it;
}
   //逆向迭代
  for(vector<int>::reverse_iterator it=v1.rbegin();it!=v1.rend();it++)
    cout<<*it<<" ";

字符串(string)

初始化

string s=string(n,'*');//复制n次,字符复制n次。

内置函数

//截取字串
string s="123123";
string sub=s.substr(0,5);//从起始位置0截取长度为5的子串

//查询单个字符
bool flag=s.find(c)!=string::npos;

二进制哈希(bitset)

初始化

 #include <bitset>
 std::bitset<N> bitset1; // 创建一个长度为 N 的 bitset,所有位都被初始化为 0
 std::bitset<N> bitset2(value); // 使用二进制整数 value 初始化一个长度为 N 的 bitset
 std::bitset<N> bitset3(string); // 使用二进制字符串 string 初始化一个长度为 N 的 bitset
 std::bitset<N> bitset4(bitset); // 使用另一个 bitset 初始化一个长度为 N 的 bitset

//int(4位)
bitset<sizeof(int)> bits;

内置方法

//可以直接输出,二进制字符串
cout<<bits;

无序字典(unordered_map)

初始化

#include <unordered_map>
unordered_map<int,int> up;

有序字典(map)

底层采用的是树型结构(红黑树)

多数使用平衡二叉树

有序,不重复

初始化

map<int,int> p;

基本操作

插入元素

map1.insert(pair<int,string>(1,"ta"));
map1.insert(make_pair(2,"he"));
map1.insert(map<int,string>::value_type(3,"wo"));
map1[4]="ha";

删除元素

for(map<int,string>::iterator it=map1.begin();it!=map1.end();it++){
if(it->second.compare("ll")==0){
map1.erase(it);
  }
}

查找元素

find

equal_range

map<int,string>::iterator it=map1.find(100);//返回迭代器的指针位置
pair<map<int,string>::iterator,map<int,string>::iterator> m=map1.equal_range(1);
//第一个属性为小于等于1的迭代器位置,第二个为大于1的迭代器位置
//遍历
map<int> p;
for(auto &entry:p){
	int key=entry.first;
	int val=enrty.second;
}

有序哈希(set)

用来判断一个元素是否在一个组里,底层数据结构为红黑树,有序,不重复。

初始化

set<int>默认创建从小到大的int类型集合

set<int,less>创建从小到大的int类型集合

set<int,greater>创建从大到小的int类型集合

基本操作

s.insert(1);
//插入:插入重复元素,判为失败,返回一个pair类型`pair<iterator,bool>`
//复杂类型数据,需要通过仿函数来确定元素顺序,判断是否是重复元素
s.empty();
s.erase(1);
set<int>::iterator it=s.begin();
s.erase(*it)

查找元素

set<int> s;
s.insert(1);
set<int>::iterator it0=s.find(1);//查找元素为1的迭代器位置
set<int>::iterator it1=s.lower_bound(1);//查找小于等于1的迭代器位置
set<int>:: iterator it2=1.upper_bound(1);//查找大于等于1的迭代器位置
pair<set<int>::iterator,set<int>::iterator> m=s.equal_range(1);
//第一个属性表示大于等于1的迭代器位置,第二个是大于1的迭代器位置

重复有序哈希(multiset)

初始化

multiset<int> p;
multiset<int,less<int>>set1;//升序
multiset<int, greater<int>>set1;//降序

基本操作

//插入一个数
p.insert(x);
p.emplace(x);

//访问第一个数,也是最值
int x=*st.begin();

//查找第2大值
*(prev(s.end(),2);//当“n“为正数时,返回传入迭代器“iterator”左边,
//当“n“为负数时,返回传入迭代器“iterator”右边,

//删除第一个数
p.extract(p.begin());
p.erase(p.begin());

//删除元素为x的全部副本
p.erase(x);

数组(array)

初始化

array<int,10> a;//因为长度固定,这里的元素个数不能是变量。

基本操作

a.front();//返回数组第一个元素的引用
a.back();//返回数组最后一个元素的引用

栈(stack)

初始化

stack<int> st;

基本操作

s1.push();//压栈
s1.empty();//判空
s1.top();//视图
s1.size();//大小
s1.pop();//出栈

双向链表(list)

相当于java的LinkedList

支持很好的效率任意地方的删除和插入

不支持随机访问

初始化

list<int> l;

基本方法

push_front()//头插入元素
push_back()//尾插入元素
`erase()`通过位置或者区间来删除,主要结合迭代器指针来操作
`remove()`通过指定值来删除
l.erase(l.begin());
l.remove(100);

遍历方法

for(list<int>::iterator it=l.begin();it!=l.end();it++)
  cout<<*it<<" ";

标签:学习指南,初始化,begin,iterator,STL,元素,vector,push
From: https://www.cnblogs.com/taotao123456/p/17816138.html

相关文章

  • 关于C++中STL的简单入门(updating)
    前言:本篇文章将对STL(标准模板库)进行一个简单的介绍,以方便在算法竞赛中节省时间并方便使用。C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以......
  • Sandcastle生成文档
    下载:https://github.com/EWSoftware/SHFB/releases使用Sandcastle生成Api文档需要使用对应程序集的注释xml+程序集dll作为数据源,通过对xml+dll数据解析生成文档;所以主体步骤如下:程序集资源生成创建配置.shfbproj项目编译构建文档程序集资源生成生成程序集ApiXml配......
  • 异或树学习指南
    前置芝士异或树中可以形成回文的路径数[problemdescription]给你一棵树(即,一个连通、无向且无环的图),根节点为0,由编号从0到n-1的n个节点组成。这棵树用一个长度为n、下标从0开始的数组parent表示,其中parent[i]为节点i的父节点,由于节点0为根节点,所以pa......
  • 倍增算法学习指南
    前置芝士倍增思想ST表(SparseTable,稀疏表)是一种简单的数据结构,解决RMQ(区间最大/最小值查询)问题。主要应用倍增思想。O(NlogN)的预处理,O(1)的查询。ST表是用于解决可重复贡献问题的数据结构。[预处理ST表]倍增法递推:用两个等长小区间拼凑一个大区间。f[i][j]表示以第i个数......
  • STL 坑点/细节
    引自cppreference.com的语句会标粗体。有些可能不是标准中的内容,但是GCC是这么实现的。所有STL如果两个对象a与b相互不比较小于对方:!comp(a,b)&&!comp(b,a),那么认为它们等价。即在STL中,a==b\(\iff\)!comp(a,b)&&!comp(b,a)std::multiset<Key,Com......
  • c++ STL源码解读
    红黑树map,key不能添加相同的key,如果添加不会报错,但是添加不进去 #include<iostream>#include<map>#include<set>usingnamespacestd;intmain(intargc,charconst*argv[]){map<int,int>a;a.insert(make_pair(1,1));a.insert(make_pair(1,......
  • 使用docker 部署testlink
    docker部署testlink1、拉取db镜像:dockerpullbitnami/mariadb 2、拉取testlink镜像:dockerpullbitnami/testlink3、容器网络:docker networkcreatetestlink4、查看网络:dockernetworkls 4.1、删除网络 dockernetworkrm<networkname>5、创建数据库卷......
  • STL之红黑树的模拟实现(万字长文详解)
    STL之红黑树的模拟实现红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,==红黑树确保没有一条路径会比其他路径长出俩倍==,因而是==接近平衡==的。==意思就是最长路......
  • 爬虫工具—whistle安装与使用
    参考链接https://mbd.baidu.com/ug_share/mbox/4a83aa9e65/share?product=smartapp&tk=fae2094d0e00d4e4fae484fa554fe802&share_url=https%3A%2F%2Fzoyi14.smartapps.cn%2Fpages%2Fnote%2Findex%3Fslug%3D17c48959be44%26origin%3Dshare%26_swebfr%3D1%26_swebFromHost%......
  • STL之AVL模拟的实现(万字长文详解)
    STL之AVL模拟的实现AVL树的概念为什么会有AVL树?在STL中对map/multimap/set/multiset其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结......