《算法笔记》第六章学习笔记

《算法笔记》第六章

vector

vector是向量,可以理解成“变长数组”,使用前需要添加下列语句

#include <vector>
using namespace std;

定义

vector<typename> name;//单独定义
vector<typename> Arrayname[arraySize];//定义数组,相当于二元数组

访问

name[index]//下标访问

函数

push_back(i);//在vi后面添加i
pop_back();//删除末尾元素
size()//获取vector个数
clear();//清空vector
begin()//首元素地址
end()//尾元素的下一个地址
insert(it,x);//在it处添加元素x
erase(it);//删除it处的元素
erase(first.last);//删除[first,last)的所有元素

迭代器

可以理解成指针

vector <typename>::iterator it=vi.begin();//定义迭代器it指向首元素地址,此时*it就代表了vi的首元素

set

set是集合,自动递增排序,元素互不重复,使用前需要添加头文件

可以用来去重并升序排序

#include <set>
using namespace std;

定义

set <typename> name;//单独定义
set<typename> Arrayname[arraySize];//定义数组,数组中每一个都是set容器

访问

set只能用迭代器访问

set<typename>::iterator it;//可以通过*it访问,但不能用*(it+i)

函数

insert(x);//插入x
find(value);//返回值为value的迭代器
erase(it);//删除迭代器为it的元素
erase(value);//删除值为value的元素
erase(first,last);//删除[first,last)区间的元素
clear();//清空所有元素

string

字符串,使用前需添加头文件

字符串可以直接通过加法拼接,直接比较大小(字典序)

#include <string>
using  namespace std;

定义

string str="abc";

访问

str[i]

输入输出只能用cin和cout

迭代器

string::iterator it;

string迭代器支持直接加减某个数字

函数

length()//返回str的长度,即存放的字符数
insert(pos,string);//在pos的位置插入字符串string
insert(it,it2,it3);//在it的位置插入字符串[it2,it3)
erase(it);//删除迭代器为it的元素
erase(first,last);//删除[first,last)区间的元素
erase(pos,length)://删除从pos开始的length个字符
clear();//清空字符串
substr(pos,len)//返回从pos开始长度为len的子串
find(str2)//若str2为子串,返回第一次出现的位置,如果不是,返回string::npos
replace(pos,len,str2);//把从pos开始长度为len的子串替换为str2
replace(it1,it2,str2);//把[it1,it2)替换为str2

map

map可以将基本类型映射到基本类型,基本类型也可以是STL容器,使用前需添加头文件

可以用来建立字符(串)与整数之间的联系,判断大整数或者其他类型是否存在的题目,把map当bool数组用

#include <map>
using namespace std;

定义

如果是字符串到整数的映射必须使用string而不是char

map<typename1,typename2> mp;

访问

mp[type1]//相当于mp[type2]

迭代器

map<typename1,typename2>::iterator it;
it ->first//当前映射的键
it ->second//当前映射的值

函数

find(key)//返回键为key的迭代器
erase(it);//删除迭代器为it的元素
erase(key);//删除键为key的元素
erase(first,last);//删除迭代器为[first,last)的元素
size()//映射的对数
clear();//清空

queue

队列,使用前需添加头文件

#include <queue>
using namespace std;

定义

queue <typename> name;

访问

使用front和back之前要先用empty判断一下队列是否为空

front()//队首元素
back()//队尾元素

函数

push(x);//将x入队
pop();//令首元素出列
empty()//检测queue是否为空,返回true则空,返回false则空
size()//队列元素个数

priority_queue

优先队列

定义

先添加和queue一样的头文件

#include <queue>
using namespace std;
priority_queue<typename>name;

访问

top()//访问优先级最高的元素

函数

push(x);//将x入队
pop();//令队首元素出队
empty()//检测queue是否为空,返回true则空,返回false则非空
size()//队列元素个数

优先级

基本数据类型

一般是数字大的优先级高,定义如下

priority_queue<int> q;
priority_queue<int,vector<int>,less<int>> q;//两者等价

想让数字小的优先级大只需

priority_queue<int,vector<int>,greater<int>> q;
结构体类型

在结构体里面重载小于号即可

struct fruit{
  string name;
  int price;
  friend bool operator < (fruit f1,fruit f2){
    return f1.price < f2.price;//把小于号改成大于号就反一下
  }
};

这样之后f1<f2就等价于f1.price<f2.price

再定义fruit类型的优先队列,内部就是以价格高的水果为优先级高

也可以把重载函数写在结构体外面

struct cmp{
  bool operator () (fruit f1, fruit f2){
    return f1.price>f2.price;
  }
}
priority_queue<fruit, vector<fruit>, cmp> q;//定义

stack

栈,后进先出的容器,使用前需加上头文件

#include <stack>
using namespace std;
stack<typename> name;//定义

访问

top()//访问栈顶元素

函数

push(x);//将x入栈
pop();//弹出栈顶元素
empty()//返回true则空,返回false则非空
size()//返回元素个数

pair

把两个元素绑在一起作为一个合成元素,可以看成有两个元素的结构体

定义

#include <utility>//添加map头文件后会自动添加utility
using namespace std;
pair<typename1,typename2> name(value1,value2);//value为初始化元素

访问

pair.first//访问第一个元素
pair.second//访问第二个元素

比较

两个pair类型比较是先比较first再比较second

algorithm

使用前需添加头文件

#include <algorithm>
using namespace std;
max(x,y)//返回较大值
min(x.y)//返回较小值
abs(x)//返回绝对值
swap(x,y);//交换x,y的值
reverse(it,it2);//将[it,it2)的元素进行反转
next_permutation(序列);//给出一个序列在全排列中的下一个序列
fill(区间,值);//把某段区间赋为相同的某个值
lower_bound(first,last,val)//寻找在[first,last)范围内第一个值大于等于val的位置,如果是数组则返回指针,如果是容器则返回迭代器,如果没有要寻找的元素则返回可以插入该元素的指针或迭代器
upper_bound(first,last,val)//寻找在[first,last)范围内第一个值大于等于val的位置,如果是数组则返回指针,如果是容器则返回迭代器,如果没有要寻找的元素则返回可以插入该元素的指针或迭代器

sort

sort(首元素地址,尾元素地址,比较函数(非必填));;//默认从小到大排序

如果需要从大到小,则需要使用比较函数

bool bmp(int a,int b){
  return a>b;//当a大于b时把a放在b前面,即降序
}

STL容器中,只有vector,string,deque可以用sort

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值