上机能够用到的C++ STL

vector

vector,译为:向量。这里指变长数组。

定义
	vector<typename> name;//定义一个name变长一维数组
	vector<vector<int> > name;//定义一个变长二维数组name,int型
	vector<typename> name[Maxn];//定义一个二维数组name,外维是定长的,内维度是变长的
访问
	//访问方法一:迭代器访问
	vector<typename>::iterator it;//it类似于指针,访问元素时:*it
	//访问方法二:数组常规访问
	vector<int> a;
	a[0];//对应数组的第一个元素
常用函数
	#include<vector>
	vector<int> vi;//初次定义时候,数组为空,长度为0
	vector<int>::iterator it;//定义一个vector的指针it,这是一个迭代器,名为it
	vi.push_back(x);//将x添加到变长数组的尾部
	it=vi.begin();//it指向数组的第一个元素的地址;vi[i]等价于*(vi.begin()+i);
	it=vi.end();//it指向数组元素最后一个元素的下一个地址,也就是数组结束的地址,类似于串的‘\0’元素的地址
	//注意:关于迭代器的比较,对应:it!=vi.end();只能这样比较。不存在it<vi.end();
	vi.pop_back();//删除vi的尾元素
	int size=vi.size();//size为容器的大小,也就是数组的长度
	vi.clear();//清空容器vi
	vi.insert(it,x);//在迭代器it处插入x,其他元素整体后移;
	vi.erase(it);//删除迭代器it所指的元素
	vi.erase(fiest,end);//删除迭代器从first到end范围的元素,[first,end)
set

set,译为:集合,是一个内部自动有序不含重复元素的容器。

定义
	set<typename> name;//定义一个名为name的typename类型的集合,它可以实现自动去重
访问

!!!set的访问只能通过迭代器(iterator)访问。

	set<int>::iterator it;
	只有vector和string支持*(it+i)的访问方式
常用函数
	#include<set>
	set<int> st;
	set<int>::iterator it;
	st.insert(x);//将x插入set容器中,并自动递增去重
	it=st.find(x);//返回集合中x的位置。返回的是一个迭代器
	st.erase(it);//删除位置为it的元素
	st.erase(value);//删除set中值为value的元素
	st.erase(first,end);//删除迭代器所指区间为[first,end)位置的元素
	int num=st.size()//获取set中元素的个数
	st.clear();//清空set
string

string,就是对字符串及其功能的封装。

定义
	string str;
	string str=“hello world!”;
访问

!!!注意:读入、输出整个字符串只能用cin,cout;

	cout << str[i];/通过下标访问
	string::iterator it;
	cin >> str;//遇到空格或者回车结束输入
	cout << *it;//通过迭代器访问
	getline(cin,str);//从输入流读取一行字符到str,遇到回车结束('\0'),忽略空格;
常用函数

1、运算符重载

	string str1="Hello ";
	string str2="world!";
	string str3=str1+str2;
	cout << str3 << endl;

2、比较操作,直接比较,字典顺序

	string str1="Hello";
	string str2="world";
	if(str1<str2) 		cout << "str2 is bigger!" << endl;

3、经常使用的“小函数”

	int length = str.length();
	int length = str.size();
	string::iterator it;
	it = str.begin();//it指向串的首元素
	it = str.end();//it指向串的结束位置
	str.insert(3,str2);//在str的str[3]位置处插入串str2,其他元素全部往后平移
	str.insert(it,it2,it3);//将迭代器it2和it3之间的元素,加入到迭代器it所指的位置
	str.erase(it);//删除迭代器it所指的元素
	str.erase(str.begin()+2,str.end());//删除自串 str[2]之后的所有元素,[str.begin+2 , str.end)
	str.erase(3,2)//删除从3号元素开始的2个字符
	str.clear();//清空串
	str2 = str.substr(3,2);//将str的第3号元素开始的2个字符,传给str2
	//string::npos 意思是“没有位置了,也就是到了串的末尾了”,其本身为-1或者4294967295(2的32次方-1,对应二进制也就是32个1)
	//string::npos 用以作为find函数失配时的返回值,代表查找失败,没有这样的元字串
	int pos = str.find(str2);//返回字串str2在str出现的第一个位置
	int pos2 = str.find(str2,7);//从str的7号位开始匹配str2,返回第一次匹配成功的位置
	str.replace(0,5,str2)//从0号位开始,长度为5的字串,被str2替换
	str.replace(it1,it2,str2);//从迭代器所指区间[it1,it2) 之间的元素,被str2替换
map

map,译为映射。map可以将任何基本类型映射到任何基本类型。
map会以键从小到大的顺序自动排序。

定义
#include<map>
using namespace std;
//映射前的叫键(key),映射后的叫值。map中键必须使唯一的。
map<typename1,typename2> mp;
map<string,int> mp;
//如果使字符串到int的映射只能用string,不可以使用char[]
map<set<int>, string> mp;
访问
//下标访问
map<char,int> mp;
mp['c']=20;
cout << mp['c'] << endl;
//迭代器访问
map<typename1,typename2>::iterator it;
mp['m']=20;
mp['r']=30;
mp['a']=40;
for(map<char,int>::iterator it=mp.begin(); it!=mp.end(); it++)
{
	cout << it->first << it->second << endl;
}
//it->first访问键,it->second访问值
//注意map会以键从小到大的顺序自动排序j
常用函数
it=mp.find(key);//返回键为key的迭代器
mp.erase(it);//删除迭代器所指的单个元素
mp.erase(key);//删除键为key的单个元素
mp.erase(it,mp.end());//删除[it,mp.end)区间内的元素
int num=mp.size();
mp.clear();//清空map
queue

队列。常用于广度优先搜索树**。使用front()和pop()函数前,必须使用empty()判断队列是否为空。**

定义
queue<int> q;
常用函数
q.push(x);//将x入队,置于队尾
q.pop();//令队首元素出队
cout << q.front() << q.back();//发别输出队首和队尾的元素
if(q.empty());
priority_queue

优先队列。队首元素一定是当前队列中优先级最高的一个。常用于贪心算法。无front()和back()函数,只能通过top()函数来访问队首元素。

定义
priority_queue<int> q;
元素访问
cout << q.top();
常用函数
q.push(x);//将x入队
q.pop();//令队首元素出队
if(q.empty());
int sum=q.size();
队列优先级设置
priority<int ,vector<int> , less<int> > q;//数字大优先级大
priority<int ,vector<int> , greater<int> > q;//数字小优先级大

//结构体优先级设置
struct fruit{
	string name;
	int price;
	friend bool operator < (fruit f1, fruit f2){
		return f1.price<f2.price;
	}
};
//friend 友元;bool operator < (fruit f1, fruit f2) 是一个重载
//优先队列设置的排序,与sort设置的排序,效果相反。
stack

栈。常用于模拟实现一些递归,防止程序对栈内存的限制而导致程序运行出错。

定义
stack<int> st;
元素访问

只能通过top()来访问栈顶元素。

cout << st.top();
常用函数
st.push(x);//将x入栈
st.pop();
if(st.empty());
int num=st.size();
pair

将两个元素绑在一起作为一个合成元素。用来代替二元结构及其构造函数,可以节省编码时间。也可作为map的键和值作为插入。

定义
#include<utility>
//如果忘记了头文件的名字
#include<map>//添加map时候,会自动添加utility
pair<string, int> p;
元素访问

只能用first和second。

pair<string, int> p;
p.first = "haha";
p.second = 5;
cout << p.first << " " << p.second << endl;
p = make_pair("xixi" , 55);//自带的函数用于初始化
p = pair<string, int>("heihei", 555);
可以直接比较

比较规则是: 先以first的大小为标准,first相同时,比较second大小。

作为map的键和值插入
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
	map<string , int> mp;
	mp.insert(make_pair("haha",5));
	mp.insert(make_pair("heihei",10));
	for(map<string , int>::iterator it = mp.begin(); it!= mp.end(); it++)
	{
		cout << it->first << " " << it->second << endl;
	}
	return 0;
}
algorithm头文件下的常用函数

只有vector、string、deque可以使用sort ;set、map自动排序。 // deque双端队列

int max_ = max(a,b);
int min_ = min(a,b);
int x = abs(x);
float x = fabs(x);
swap(a,b);//a,b在内存中互换位置
reverse(it,it2);//反转迭代器 或者 指针 所指区间[it,it2)之间的元素的顺序
sort(it , it2 ,cmp)//按照cmp的排序规则,对指针或 迭代器 所指区间[it,it2)之间的元素排序

lower_bound(first, last, val) 用来寻找在数组或容器的[first,last)范围内第一个值>=val的元素的位置;若是数组,则返回该位置的指针;若是容器,则返回该位置的迭代器。
upper_bound(first,last,val) 用来寻找在数组或容器的[first,last)范围内第一个值>val的元素的位置;若是数组,则返回该位置的指针;若是容器,则返回该位置的迭代器。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int a[10]={1,2,2,3,3,3,5,5,5,5};
	printf("%d,%d\n", lower_bound(a,a+10,3)-a,upper_bound(a,a+10,3)-a);
	return 0;
}
//结果: 3,6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值