STL函数及使用

迭代器

在这里插入图片描述

容器类

pair

p a i r pair pair 可以自定义一个包含任意两个类型的类似结构体的结构。
如 pair<T1,T2>
T1 、T2可以是 int ,也可以是 string
调用的时候可以用 变量名.first,变量名.second,来调用

#include <iostream>
using namespace std;
int main()
{
	pair<int,int> a;  //创建一个pair 
	pair<string,int> d;
	a.first=1;  //pair的赋值 
	a.second=2;
	cout<<a.first<<" "<<a.second<<endl;   //输出
	pair<int,int> b(3,4);  //将pair赋初值 
	cout<<b.first<<" "<<b.second<<endl; 
	b=make_pair(5,6); //另一种赋值方法
	cout<<b.first<<" "<<b.second<<endl;
	pair<int,pair<int,int> > c;  //pair嵌套
	c.first=7;
	c.second.first=8;
	c.second.second=9;
	//pair 嵌套赋值 
	return 0;
} 

vector

vector 的一些基本函数操作

  • c.clear()
    移除容器中所有数据
  • c.empty()
    判断容器是否为空
  • c.erase(pos)
    删除pos位置的数据
  • c.erase(begin,end)
    删除[pos,end)的数据
  • c.front()
    传回第一个数据
  • c.insert(pos,elem)
    在pos位置插入一个elem的拷贝
  • c.pop_back()
    删除最后一个数据
  • c.push_back(elem)
    在尾部加入一个数据
  • c.resize(num)
    重新设计该容器的大小
  • c.size()
    返回容器实际元素的个数
  • c.begin()
    返回指向容器第一个元素的迭代器
  • c.end()
    返回指向容器最后一个元素的迭代器
  • c.shrink_to_fit()
    将不包含数据的存储单位删除
  • c.capacity()
    返回数组实际占用的内存空间
  • c.reserve(num)
    改变动态数组的实际分配内存空间
#include <bits/stdc++.h>
using namespace std;
int main()
{
	vector<int> c;  //定义动态数组 
	
	for(int i=0;i<10;i++)
	  c.push_back(i*i*i*i%23);  //将伪随机数存入数组 c  
	  
	cout<<c.capacity()<<endl;  //动态数组所分配的内存空间 
	c.reserve(20);  //改变分配的内存空间 
	cout<<c.capacity()<<endl;
	  
	c.erase(c.begin()+5);   //删除下标为5的元素。
	
	c.insert(c.begin()+5,114514);  //在下标为5的地方插入114514 
	
	for(int i=0;i<c.size();i++)
	  cout<<c[i]<<" ";
	cout<<endl;
	vector<int>::iterator it;  //声明一个迭代器 
	for(it=c.begin();it!=c.end();it++)   //迭代器遍历
	  cout<<*it<<" ";
	cout<<endl;
	for(int i=c.size()-1;i>=0;i--)  //倒叙遍历 
	  cout<<c[i]<<" ";
	cout<<endl;
	for(const auto& tmp:c)  //另一种特别的遍历方式 
	  cout<<tmp<<" ";
	cout<<endl;
	  
	c.pop_back(); //弹出最后一个元素
	for(int i=0;i<c.size();i++)
	  cout<<c[i]<<" ";
	cout<<endl;
	  
	c.erase(c.begin()+3,c.begin()+4);  //删除区间[3,4)的元素。 
	for(int i=0;i<c.size();i++)
	  cout<<c[i]<<" ";
	cout<<endl;
	  
	c.clear();  //清空数组。 
	cout<<c.size()<<endl;
	c.resize(5);  //改变动态数组的大小,若在后面再压入数据,这些位置会空出。 
	cout<<c.size()<<endl;
	
	cout<<c.max_size()<<endl;   //输出动态数组最大可存储的数据个数
	
	//二维动态数组
	
	int n=5,m=6; 
	vector<vector<int> > a(n); //声明一个动态数组5行
	for(int i=0;i<a.size();i++)
	  a[i].resize(m);  //声明动态数组每行6列
	cout<<a.size()<<endl;   //此时 a.size 表示数组行的数量
	cout<<a[1].size()<<endl;   //列的数量
	
	vector<vector<int> > b(n,vector<int>(m));  //另一种定义n行 m 列的方法。
	
	vector<int> d[5]; //也可以这样 
	
	for(int i=1;i<=10;i++)
	  c.push_back(i*i*i*i*i%37);
	sort(c.begin(),c.end());   //动态数组的排序
	for(int i=0;i<c.size();i++)
	  cout<<c[i]<<" "; 
	//由于在前面改变了 c 数组的初始大小,因此在输出前会空出几个空位置0. 
	
	cout<<endl;
	cout<<c.capacity()<<endl;   //c数组在内存中实际占用的空间 2^n 
	c.shrink_to_fit();  //去除c数组中不包含元素的内存块 
	cout<<c.capacity()<<endl;  
	return 0;
} 

map

在这里插入图片描述

#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
int main()
{
	map<string,int> a;  //定义一个以字符串作为key的map数组 
	
	a["a"]=1;
	a.insert(map<string,int>::value_type("b",2));
	a.insert(pair<string,int>("c",3));
	a.insert(make_pair("d",4));
	cout<<a["a"]<<" "<<a["b"]<<" "<<a["c"]<<" "<<a["d"]<<endl; 
	//在map数组中插入数据的几种方法。 
	
	a.insert(make_pair("b",3));
	a["a"]=2;
	cout<<a["a"]<<" "<<a["b"]<<endl;
	//insert只能插入数据,但如果存储单位已经存在了数据那么是无法被insert更改的。
	//直接以赋值的方式可以更改 map 数组中的数据
	
	int x=a["a"];
	cout<<x<<endl;
	//可以把一个 map 真正当成一个数组使用 
	
	x=a["aaaa"];
	cout<<x<<endl;
	//可知若 map 中没有实值,那么初值为0
	
	a["d"]=114514;
	map<string,int>::iterator it;
	int key;
	it=a.find("c");  //由于find返回一个迭代器,因此it要用迭代器定义 
	if(it!=a.end())  //若在map中查找不到这么个键值那么返回end() 
	  key=it->second;  //表示key=这个键值的实值 ,it->second表示索引实值 
	cout<<key<<endl;
	//在map中查找键值为"c"的实值
	
	int i_t;
	i_t=a.count("d");
	if(i_t) cout<<"yes";
	else cout<<"no";
	cout<<endl; 
	//判断map中是否存在一个键值为 "d" 的元素 
	
	map<string,int>::iterator i__t;
	for(i__t=a.begin();i__t!=a.end();i__t++)
	  cout<<i__t->first<<" "<<i__t->second<<endl; 
	cout<<endl;
	  //用迭代器i__t分别指向map的键值和实值输出
	  //i__t->first为索引键值 i__t->second为索引值
	
	for(const auto& tmp:a)
	  cout<<tmp.first<<" "<<tmp.second<<endl;
	cout<<endl;
	  //使用这种遍历方法auto把map视为了一个具体的值,即为pair,因此输出键值什么的按照pair来输出 
	
	map<long long,string> b;
	b[1]="a";
	b[2]="b";
	b[3]="c";
	for(int i=1;i<=b.size();i++)
	  //注意要从1开始 
	  cout<<b[i]<<endl;
	cout<<endl;
	//这种遍历方式只有键值可枚举(即不是string类型)才可实现
	
	//map的遍历
	
	//unordered_后面加上map表示用hash实现,读取数值更快。 
	
	map<string,int>::iterator i___t;
	i___t=a.find("aaaa");
	a.erase(i___t);
	//先利用迭代器找到键值为aaaa的map,然后将它删除。 
	for(const auto& tmp:a)
	  cout<<tmp.first<<" "<<tmp.second<<endl;
	cout<<endl;
	//erase里面放迭代器
	
	a.clear();
	for(const auto& tmp:a)
	  cout<<tmp.first<<" "<<tmp.second<<endl;
	if(a.empty()) cout<<"kong";
	else cout<<"no";
	//清空map数组
	return 0;
}

set

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
int main()
{
	set<int> s;
	// 定义一个set,元素在里面是自动排好序的 
	
	s.insert(114514);
	s.insert(1);
	int a=2;
	s.insert(a);
	s.insert(1);  //重复的元素不会被放入set
	s.insert(8);
	//在set中插入元素,时间复杂度log n 
	
	set<int>::iterator it;
	for(it=s.begin();it!=s.end();it++)
	  cout<<*it<<" ";
	cout<<endl;
	//正序遍历set,元素在里面是自动由小到大排好序的 
	
	set<int>::reverse_iterator i_t;
	for(i_t=s.rbegin();i_t!=s.rend();i_t++)
	  cout<<*i_t<<" ";
	cout<<endl;
	//逆序遍历set 
	
	for(const auto& tmp:s)
	  cout<<tmp<<" ";
	cout<<endl;
	//一种简单遍历set的方法
	
	cout<<s.max_size()<<endl;
	 //set的可存储元素个数极限
	 
	cout<<s.size()<<endl;
	//set存储的元素个数
	
	s.erase(114514);
	s.erase(0);
	for(const auto& tmp:s)
	  cout<<tmp<<" ";
	cout<<endl;
	 //删除在set中的数,若不存在则不改变
	  
	set<int>::iterator t;
	t=s.lower_bound(3);   //返回符合条件数字的指针 
	cout<<*t<<endl;
	//用lower_bound函数在set中查找第一个大于等于3的数字
	
	t=s.upper_bound(1);
	cout<<*t<<endl;
	//用upper_bound函数在set中找第一个大于1的数字 
	
	s.clear();
	if(s.empty())
	  cout<<"yes"<<endl;
	
	return 0;
}

算法类:

二分

  • binary_search(a+1,a+n+1,x)
    在a数组中查找是否存在 x 元素
  • lower_bound(a+1,a+1+n,x)
    在a数组中查找第一个大于等于x元素的位置
  • upper_bound(a+1,a+1+n,x)
    在a数组中查找第一个大于x元素的位置
  • upper_bound(a+1,a+n+1,x,greater())
    在一个降序排列的a数组总查找第一个小于x元素的下标

unique

#include <iostream>
#include <algorithm>
using namespace std;
int n,m,a[110000000];
int main()
{
	//unique去重 
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  a[i]=(long long)pow(i,m)%1997;  //制造随机数 
	sort(a+1,a+1+n);  //使用函数前要先排序 
	int r=unique(a+1,a+1+n)-a-1;  //去重,把重复的元素放在数组后面,然后输出重复元素前不重复的部分,即为R值 
	for(int i=1;i<=r;i++)
	  cout<<a[i]<<" ";
	return 0;
}

next_permutation

生成数组的下一个排列

#include <iostream>
#include <algorithm>
using namespace std;
int n,m,a[110000000];
int main()
{
	//unique去重 
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	  a[i]=(long long)pow(i,m)%1997;  //制造随机数 
	sort(a+1,a+1+n);  //使用函数前要先排序 
	int r=unique(a+1,a+1+n)-a-1;  //去重,把重复的元素放在数组后面,然后输出重复元素前不重复的部分,即为R值 
	for(int i=1;i<=r;i++)
	  cout<<a[i]<<" ";
	int s;
	cin>>s;
	r=s;
	for(int i=1;i<=r;i++) a[i]=i;
	for(int i=1;i<=s;i++)
	  {
	  	next_permutation(a+1,a+1+r);  //在a数组中生成一个由a数组元素构成的排列 
	  	for(int j=1;j<=r;j++)
	  	  cout<<a[j]<<" ";
	  	cout<<endl;
	  }
	return 0;
}

list

Lst1.assign()
给list赋值
Lst1.back()
返回最后一个元素
Lst1.begin()
返回指向第一个元素的迭代器
Lst1.clear()
删除所有元素
Lst1.empty()
如果list是空的则返回true
Lst1.end()
返回末尾的迭代器
Lst1.erase()
删除一个元素
Lst1.front()
返回第一个元素
Lst1.get_all
ocator() 返回list的配置器
Lst1.insert()
插入一个元素到list中
Lst1.max_size()
返回list能容纳的最大元素数量
Lst1.merge()
合并两个list
Lst1.pop_back()
删除最后一个元素
Lst1.pop_front()
删除第一个元素
Lst1.push_back()
在list的末尾添加一个元素
Lst1.push_front()
在list的头部添加一个元素
Lst1.rbegin()
返回指向第一个元素的逆向迭代器
Lst1.remove()
从list删除元素
Lst1.remove_if()
按指定条件删除元素
Lst1.rend()
指向list末尾的逆向迭代器
Lst1.resize()
改变list的大小
Lst1.reverse()
把list的元素倒转
Lst1.size()
返回list中的元素个数
Lst1.sort()
给list排序
Lst1.splice()
合并两个list
Lst1.swap()
交换两个list
Lst1.unique()
删除list中重复的元素
————————————————
版权声明:本文为CSDN博主「西北老码农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fanyun_01/article/details/56881515

#include <bits/stdc++.h>
using namespace std;
list<int> l;
bool cmp(int p)
{
	return p!=2;
}
int main()
{
	l.push_back(1);  //在链表后面存入元素 
	l.push_back(2);
	
	list<int>::iterator it;
	it=l.begin();
	l.insert(it,114514);   //在位置it中插入114514 
	l.insert(it,114514);
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;	
	
	l.remove(114514);   //删除链表中值为114514的全部元素 
	it++;
	l.insert(it,1919810);
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	
	it--;
	l.erase(it);  //删除这个迭代器位置的元素 
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	
	list<int> s(3,2);
	l.swap(s);  //将链表l与链表s交换 
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	
	l.sort();   //为链表排序 
	
	l.merge(s);  //合并 两个链表 ,其中被合并的为空 
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	
	list<int> a(3,5);
	l.splice(l.begin(),a);   //在某个位置(这里指l链表的开头)合并两个链表 
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	//链表合并,自定义版 
	
	list<int>::reverse_iterator i_t;  //声明倒叙迭代器,倒叙遍历 
	for(i_t=l.rbegin();i_t!=l.rend();i_t++)
	  cout<<*i_t<<" ";
	cout<<endl;
	
	l.insert(l.begin(),1);
	l.remove_if(cmp);  //将不是2的元素全部删除(可以自定义) 
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	
	l.assign(3,4); //为链表赋值并覆盖原来的元素
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl; 
	
	l.unique();  //删除链表中的重复元素 
	for(const auto& tmp:l)
	  cout<<tmp<<" ";
	cout<<endl;
	
	l.clear(); //清空
	if(l.empty()) cout<<"yes"<<endl;
	
	return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值