STL初步
1.排序与检索
algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<”运算符。
排序之后可以用lower_bound查找大于或等于x的第一个位置。
待排序/查找的元素可以放在数组里,也可以放在vector里。
#include<algorithm>
#include<iostream>
#inlcude<cstdio>
using namespace std;
const int N=100;
//比较函数,降序排列
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int a[N];
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
//sort有三个参数,分别是数组首地址、尾地址,比较函数。比较函数可省略,默认为从小到大进行排序,即升序排列
sort(a,a+N,cmp);
//若数据存在vector中,则以sort(a.begin(),a.end())的方式调用。
int x=5;
//lower_bound有三个参数,分别是数组首地址、尾地址,和待查找元素
int p=lower_bound(a,a+N,x);
}
2.不定长数组:vector
vector头文件中的vector是一个不定长数组,可以用clear()清空,size()读取它的大小,resize()改变大小,用push_back()和pop_back()在尾部添加和删除元素,用empty()测试是否为空。vector之间可以直接赋值或者作为函数的返回值。
vector是一个模板类,需要用``vector a或者
vector b`的方式来声明一个vector
#include<cstdio>
#include<cstring>
#inlcude<vector>
using namespace std;
const int N=30;
int main()
{
//声明int型的vector,相当于int a[];
vector<int> a;
//相当于一个二维数组,只是第一维大小是固定的(不超过N),但第二维的大小不固定
vector<int> b[N];
for(int i=0;i<N;i++)
{
//在b[i]尾部添加元素i,注意是b[i],而不是b,每个b[i]相当于一个vector
b[i].push_back(i);
}
//保留下标0~N-10的元素
b.resize(N-10);
//b.size()为b一维的大小
for(int i=0;i<b.size();i++)
printf("%d",b[i][0]);
return 0;
}
3.集合与映射
集合和映射也是两个常用的容器
set头文件中的set和map头文件中的map分别是集合与映射。
二者都支持insert、find、count和remove操作,并且可以从小到大的顺序循环遍历其中的元素。map还提供了”[]“运算符,是的map可以像数组一样使用。事实上,map也成为“关联数组”。
3.1 集合:set
set就是数学上的集合——每个元素最多出现一次。
和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符。
set中元素已从小到大排好序
set常用操作:
-
begin() 返回set容器的第一个迭代器
-
end() 返回set容器的最后一个迭代器
-
clear() 删除set容器中的所有的元素
-
empty() 判断set容器是否为空
-
max_size() 返回set容器可能包含的元素最大个数
-
size() 返回当前set容器中的元素个数
-
rbegin 返回的值和end()相同
-
rend() 返回的值和begin()相同
-
insert() 插入元素
//安迪的第一个字典(Andy's First Dictionary,UVa 10815)
#include<cstdio>
#include<cstring>
#include<set>
#include<sstream>
#include<iostream>
using namespace std;
int main()
{
//string集合
set<string> dict;
string s,buf;
while(cin>>s)
{
for(int i=0;i<s.length();i++)
{
//isalpha()判断字符是否为字母的函数
if(isalpha(s[i]))
{
//tolower()将字母变为小写的函数
s[i]=tolower(s[i]);
}
else
s[i]=' ';
}
//字符串流
stringstream ss(s);
while(ss >> buf)
dict.insert(buf);
}
//iterator是迭代器,用法类似于指针
for(set<string>::iterator it=dict.begin();it!=dict.end();++it)
cout<<*it<<"\n";
return 0;
}
3.2 映射:map
map就是从键(key)到值(value)的映射。它重载了[]运算符,map像是数组的”高级版“。
map常用操作:
-
empty() 判断map容器是否为空
-
size() 返回当前map容器中元素个数
-
max_size() 用于返回当前容器可以存放的最大值
-
insert(key,value) 在map中插入元素
-
find(key) 获取元素的迭代器
-
count(key) 返回元素数目,因为映射关系的容器中所有元素都是唯一的,所以返回0或1
-
begin() 返回map容器的第一个迭代器
-
end() 返回map容器的最后一个迭代器
#include<iostream>
#include<map>
using namespace std;
int main()
{
//声明map
map<char,int> mymap;
//直接给map赋值
mymap['a']=10;
mymap['b']=20;
mymap['c']=30;
mymap['d']=40;
mymap['e']=50;
mymap['f']=60;
//判断mymap是否为空
while(!mymap.empty())
{
cout<<mymap.begin()->first<<"=>"<<mymap.begin()->second<<"\n";
mymap.erase(mymap.begin());
}
for(map<char,int>::iterator it=mymap.begin();it!=mymap.end();it++)
cout << it->first << " => " << it->second << '\n';
//在map中查找key 'c',并返回该元素的迭代器
map<char,int>::iterator it=find('c');
//通过迭代器删除元素
mymap.erase(it);
//通过key删除元素
mymap.erase('b');
it=find('d');
//删除指定范围的元素
mymap.erase(it,mymap.end());
//插入元素
mymap.insert(pair<char,int>('g',70);
return 0;
}
4.栈、队列与优先队列
4.1 栈:stack
后进先出的数据结构
STL的stack头文件提供了栈,用stack<int> s
方式定义,用push()和pop()实现元素的入栈和出栈操作,top()取栈顶元素(但不删除)。
常用操作:
- empty() 判断栈是否为空
- pop() 删除栈顶元素
- push() 插入元素到栈顶
- size() 返回栈中元素的个数
- top() 返回栈顶元素
#include<iostream>
#include<stack>
using namespace std;
int main()
{
//声明栈
stack<int> mystack;
//将元素压入栈
for(int i=0;i<10;i++)
mystack.push(i);
//输出站长元素的个数
cout<<mystack.size()<<endl;
//判断栈是否为空
while(!mystack.empty())
{
//输出栈顶元素
cout<<mystack.top()<<' ';
//删除栈顶元素
mystack.pop();
}
return 0;
}
4.2 队列:queue
先进先出的数据结构
STL的queue头文件提供了队列,用queue<int> s
方式定义,用push()和pop()进行元素的入队和出队,front()取队首元素(但不删除)。
常用操作:
-
back() 返回队尾元素
-
empty() 判断队列是否为空
-
front() 返回队首元素
-
pop() 删除队首元素
-
push() 在队尾插入元素
-
size() 返回队列中元素的个数
#include<iostream>
#include<queue>
using namespace std;
int main()
{
//声明队列
queue<int> myqueue;
//将元素加入队列
for(int i=0;i<10;i++)
myqueue.push(i);
//输出队列中元素的个数
cout<<myqueue.size()<<endl;
//判断队列是否为空
while(!myqueue.empty())
{
//输出队首元素
cout<<myqueue.front()<<' ';
//删除队首元素
myqueue.pop();
}
return 0;
}
4.3 优先队列:priority_queue
优先队列类似于队列,但先出队列的元素为队列中优先级最高的元素,即优先队列中的元素按照优先级进行排序,默认字典序越小优先级越低。
STL的queue头文件提供了优先队列,用priority_queue<int> s
方式定义,用push()和pop()进行元素的入队和出队操作,top()取队首元素(但不删除)。
常用操作:
empty()
判断队列是否为空size()
返回队列中元素的个数top()
返回队首元素push()
插入元素pop()
删除队首元素
#include<iostream>
#include<queue>
using namespace std;
int main()
{
//声明优先队列
priority_queue<int> mypq;
//将元素加入队列
for(int i=0;i<10;i++)
mypq.push(i);
//判断队列是否为空
while(!mypq.empty())
{
//输出队首元素
cout<<mypq.top()<<' ';
//删除队首元素
mypq.pop();
}
return 0;
}
来源:https://blog.csdn.net/weixin_44641850/article/details/102732609