算法设计工具——STL

C++中已经实现了数据结构中的很多容器和算法,它们构成了C++库的子集,即标准模板类库。STL是一个功能强大的基于模板的容器库。
遵循“尽可能使用STL而不是自己实现”,下面整理STL的一些使用方法便于搜索。(之前已经整理了一些例如map)
持续更新中ing,未完待续(只能抽时间来写)
你的三连就是我创作的最大动力。

STL概述

STL只要由容器,算法和迭代器。迭代器用于存放元素。下面给出常用的数据结构。算法主要由

数据结构说明
向量vector连续存储元素,底层数据结构为数组,支持快速随机访问
字符串string字符串处理容器
双端队列deque连续存储的指向不同元素的指针所组成的数组
链表list由节点组成的链表,每个结点包含一个元素,底层为双向链表
队列queue先进先出的序列
栈stack后进先出的序列
集合set由节点组成的黑红树,set有序不重复
映射map由关键词,值组成的集合,底层为红黑树

C++引入了命名空间,STL的sort()封装在std中了。

STL迭代器

STL迭代器用于访问容器中的数据对象,它就像C++中的指针,算法通过迭代器来定位和操作容器的元素。

常用迭代器说明
iterator指向容器存放的元素,用于正向遍历
const_iterator只能读取元素
reverse_iterator指向容器中元素的反向迭代器,用于反向遍历

++正向移动;–反向移动;*返回迭代器所指的元素值

vector<int> m={1,2,3,4,5};
vector<int>::iterator it;
for(it=m.begin();it!=m.end();++it)cout<<*it<<" ";

顺序容器

部分成员函数相同的只写一遍,大多容器的成员函数功能都相同

vector

相当于数组。
定义vector的几种方法

vector<int> v1 
vector<int> v2(10);//指定向量v2大小为10个
vector<int> v3(10,1.23) //指定v3的10个初始值为1.23
vector<int> v4(a,a+5) //用数组5个元素初始化
vector主要成员函数功能
empty()
size()返回实际元素个数
[]返回指定下标元素
reserve(n)分配n个空间
capacity返回重新分配前所容纳的个数
push_back向尾部添加
insert(pos,elem)在pos位置插入elem
rbegin()/rend()引用最后一个/第一个

string

string重载了许多运算符,包括+,+=,<,=,[],<<,>>等
创建string容器的方法

char a[]="CHINA";
string s1(a)
string s2(s1)
string s3(a,5)
string s4(5,'A')
string成员函数功能
compare(string &str)比较字符串
append(cstr)末尾添一个字符串
substr(size_type,size_len)取子串
clear()删除所有
erase(idx,len)删除从idx开始的len个字符

关联容器

关联容器都有一个key,通过key来存储和读取元素,这些关键字与位置无关,故没有顺序容器等部分操作。

set/multiset

集合类模板,set关键字唯一,而multiset不唯一。

set/multiset成员函数功能
empty()判断空
count(k)关键词出现的次数
find(k)存在k
end/begin正向迭代
rbegin/rend反向迭代
set<int> s;
set<int>::iterator it;
s.insert(key);

map/multimap

映射类模板,实现关键字与值关系的存储结构
类似于pair结构

struct pair{
	T first;
	T second;
}

pair对运算符进行了重载
map支持[]运算符,multimap则不支持
成员函数功能同set,这里不再赘述。其中部分语法可以见此处blog,有详细解释其中的语法,其中有专项练习。点击此处

//只有当map有关键字才会成功,否则自动插入
if(m.find(key)==m.end()){//没找到的处理}
else {//找到后的处理}
map<char,int> m;
m.insert(pair<char,int>('a',1);
m.insert(map<char,int>::value_type('b',2);
//遍历操作
map<char,int>::iterator it;
for(it=m.begin();it!=m.end();++it){
	cout<<it->first<<" "<<it->second;
}

适配器容器

stack

成员函数功能
empty()
push(elem)进栈
top()返回栈顶元素
pop()出栈

queue

成员函数功能
front()返回队头元素
back()返回队尾
push(elem)进队
pop()进队,配合while(!empty())操作

对数据的排序

内置数据类型的排序

sort()默认以less(小于关系函数)作为增序排序,为实现递减排序,需要调用functional头文件定义的greater类模板

vector<int> m;
sort(m.begin(),m.end(),less<int>())//等同于sort
sort(m.begin(),m.end(),greater<int>())//递减排序

自定义数据类型排序

sort(m.begin(),m.end(),Cmp);

//实现结构体排序
struct Stud{
	int no;
	string name;
}
bool cmp(Stud a,Stud b){
	return a.no<b.no;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值