首页 > 编程语言 >c++常用STL库及常用函数

c++常用STL库及常用函数

时间:2023-03-18 14:44:06浏览次数:34  
标签:常用 STL 库及 int num vec push include

临近各种算法比赛,相信很多人想笔者一样还总是记不住很多函数的用法,特此总结一下常用的STL标准库以及标准函数,希望能够有所帮助。

1. 输入输出

输入输出一般用两个标准库:

#include<cstdio>
#include<iostream>

一般笔者更习惯一些iostream库,iostream唯一比较常用但是难记的或许就是以下这句。

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

这句可以使得c++的cin,cout语句拥有接近printf和scanf的速度。

之所以不用printf和scanf,则纯粹是大学先接触的cin、cout罢了

2. 数组

一般来说,使用c++标准的数组也就足够了:

int arr[10005];

不过一些特殊情况下,我们肯能还是需要用到c++封装好的数组:vector。

vector可以支持在常数时间内的随机访问和尾部插入/删除操作,其使用案例如下:

# include<vector>

int<vector> vec(n); // n指定长度

// 常用函数
vec.push_back(number);
vec.pop_back();
int n=vec.size();

// 其它函数
vec.clear();
bool flag=vec.empty();

// 遍历方法
//1. 传统方法
int n=vec.size();
for(int i=0;i<n;i++{
  cout<<vec[i]<<endl;
}

//2. C++11中的方法
  for (auto num:vec)
  {
    cout<<num<<endl;
  }

3. set与map

可以说,set与map是C++中,除了数组之外最常用搞得数据结构了。set与map通常我们使用这四种类。

#include<set>
#include<unordered_set>

#include<map>
#include<unordered_map>

其中,加入unordered 前缀意味者不需要排序。如果没有unordered 前缀,那么该集合中的元素将会按照红黑树自动排序,这在我们需要有序数据或是遍历的时候较为有用。而加入unordered 前缀后,则集合中的元素会基于哈希表组织,插入和查找的时间复杂度很低(常数时间)。

以下是一些它们常用的函数(加入unordered 前缀与不加对应的函数是几乎一致的,只是内部实现略有不同)。

// 集合
set<int> s;

// 常用函数
int n=s.size();
s.insert(num);
s.erase(num);
s.count(num); // 常用来判断有无这一元素

// 遍历元素
set<int>::iterator it;
for(it = s1.begin(); it!=s1.end(); it++){ //自动排序元素
    cout<<*it<<endl;  // 这里的it是个指向数据的指针
}
//c++ 11
for(auto it : s){
    cout<<it<<endl;   // 这里的it就是数据本身
}
 
// map
map<string, int> m;

// 常用函数
int n=m.size();
m[key]=value; // 最简单的插入方法(个人认为)
m.erase(key);
s.count(key); // 常用来判断有无这一元素

// 遍历元素
map<string, int>::iterator it;
for (it = m.begin(); it != m.end(); it++) {
    cout<<it->first<<" "<<it->second<<endl;
}
// c++ 11
for(auto it : m){
    cout<<it.first<<" "<<it.second<<endl;
}

4. 常用算法(sort)

c++中,我们也会经常使用一些常用的算法,它们大多定义在algorithm包中,也有一些在std标准命名空间中:

using namespace std;

int max_value=max(a,b);

同时,algorithm中最常用的函数莫过于sort函数了,掌握sort函数非常重要。

#include<algorithm>

sort(vec.begin(),vec.end()); // 一般sort是针对vec或传统数组的,毕竟map和set本身自动排序

至于其它的算法,我认为不是特别重要,故直接省略

5. 栈和队列

除了上述所说的较为重要的库,栈和队列在数据结构中也是非常重要的。

#include <queue>
#include <stack>

// 队列
queue<int> q;
q.push(num);
q.pop();
int n=q.size();
bool isEmpty=q.empty();
int first=q.front(); // 队头
int last=q.back();   // 队尾:最后一个push进去的元素是队尾!

// 栈
stack<int>st;
st.push(num);
st.pop();
int top=q.top(); //栈顶元素
int n=st.size();
bool isEmpty=st.empty();

6. 优先队列和双端队列

优先队列

优先队列也在queue 库中,最简单的用法就是直接声明如下:

#include <queue>
priority_queue<int> q; 

这时q的元素就会自动从小到大排序。

当然,还有复杂一些的用法:

#include <queue>
// 大根堆
priority_queue<int> q; //等同于 priority_queue<int, vector<int>, less<int>> a;

// 小根堆
priority_queue<int, vector<int>, greater<int>> q;


// 常用函数
q.push(num);
int top=q.top();
q.pop();

我们可以使用实际的代码看看效果:

# include<iostream>
# include<queue> 
using namespace std;
int main(){
  priority_queue<int>q;
  q.push(1);
  q.push(3);
  q.push(2);
  cout<<q.top()<<endl; // 类似于普通队列的back()
  q.pop();
  cout<<q.top()<<endl; 
}
// 结果:3 2

# include<iostream>
# include<queue> 
using namespace std;
int main(){
  priority_queue<int,vector<int>,greater<int>>q;
  q.push(1);
  q.push(3);
  q.push(2);
  cout<<q.top()<<endl;
  q.pop();
  cout<<q.top()<<endl; 
}
// 结果:1 2

双端队列

piriority_queue包含在queue中不同,双端队列在新的STL库(deque)中:

#include<deque>

queue<int>q;

// 常用函数: front指队头,back指队尾(新插入的)
q.push_back(num);
q.push_front(num);
q.pop_back();
q.pop_front();
int num=q.front();
int num=q.back();
int n=q.size();
bool flag=q.empty();

标签:常用,STL,库及,int,num,vec,push,include
From: https://www.cnblogs.com/dykkk/p/17230599.html

相关文章

  • mysql 常用的数据类型
    官网文档地址:https://dev.mysql.com/doc/refman/8.0/en/data-types.html常用的数据类型:NumericDataTypesDateandTimeDataTypesStringDataTypes,SpatialData......
  • C++ STL 容器的size_type
    在C++STL容器中,size_type是一个无符号整数类型,用于表示容器中元素的数量或大小。由于不同平台和编译器有不同的实现,因此使用size_type可以确保代码的可移植性和兼容......
  • 枚举的常用方法
    publicclassEnumDemo{publicstaticvoidmain(String[]args){//1、Stringname():获取枚举项名称Stringname=Season.SPRING.name();......
  • maven常用命令和配置
     mavenpom中的parent标签:parent标签类似java中的继承,复用依赖,减少冗余配置 使用场景(when):在多模块(module)的项目中,有很多模块中的pom中存在相同的引用,如果此时声明一......
  • pip常用命令
    使用不同的镜像源,下载包的时候可能会出现版本不匹配。则可以直接使用pipinstall包名进行下载速查版pipfreezepiplistpipinstallopenpyxlpipinstallop......
  • Docker CLI docker config create 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Doc......
  • rabbitmq 基本常用操作
    目录常用操作当前窗口启动rabbitmq后台启动rabbitmq停止rabbitmq查看所有队列查看所有虚拟主机在ErlangVM运行的情况下启动RabbitMQ应用查看节点状态查看所有可用的插......
  • nmap常用命令
    目标规格nmap192.168.1.1                   扫描一个IPnmap192.168.1.1192.168.2.1       扫描IP段nmap192.168.1.1-254       ......
  • NSIS 常用的代码
    实现递归拷贝默认生成的脚本,没有递归拷贝,我们需要手动加上 /r  实现递归拷贝目录:例子如下:File/r "..\bin\Debug\net6.0-windows\*.*"需要添加的头部代码;该......
  • Git 常用命令说明
    安装GitWindows安装包下载地址:https://git-scm.com/download/win安装时,基本按默认选项,但:在SelectComponents页,勾选WindowsExplorerintegration->Sim......