《算法笔记》第六章
《算法笔记》第六章
vector
vector是向量,可以理解成“变长数组”,使用前需要添加下列语句
c++
1 |
|
定义
c++
1 | vector<typename> name;//单独定义 |
访问
c++
1 | name[index]//下标访问 |
函数
c++
1 | push_back(i);//在vi后面添加i |
迭代器
可以理解成指针
c++
1 | vector <typename>::iterator it=vi.begin();//定义迭代器it指向首元素地址,此时*it就代表了vi的首元素 |
set
set是集合,自动递增排序,元素互不重复,使用前需要添加头文件
可以用来去重并升序排序
c++
1 |
|
定义
c++
1 | set <typename> name;//单独定义 |
访问
set只能用迭代器访问
c++
1 | set<typename>::iterator it;//可以通过*it访问,但不能用*(it+i) |
函数
c++
1 | insert(x);//插入x |
string
字符串,使用前需添加头文件
字符串可以直接通过加法拼接,直接比较大小(字典序)
c++
1 |
|
定义
string str="abc";
访问
str[i]
输入输出只能用cin和cout
迭代器
c++
1 | string::iterator it; |
string迭代器支持直接加减某个数字
函数
c++
1 | length()//返回str的长度,即存放的字符数 |
map
map可以将基本类型映射到基本类型,基本类型也可以是STL容器,使用前需添加头文件
可以用来建立字符(串)与整数之间的联系,判断大整数或者其他类型是否存在的题目,把map当bool数组用
c++
1 |
|
定义
如果是字符串到整数的映射必须使用string而不是char
c++
1 | map<typename1,typename2> mp; |
访问
c++
1 | mp[type1]//相当于mp[type2] |
迭代器
c++
1 | map<typename1,typename2>::iterator it; |
函数
c++
1 | find(key)//返回键为key的迭代器 |
queue
队列,使用前需添加头文件
c++
1 |
|
定义
c++
1 | queue <typename> name; |
访问
使用front和back之前要先用empty判断一下队列是否为空
c++
1 | front()//队首元素 |
函数
c++
1 | push(x);//将x入队 |
priority_queue
优先队列
定义
先添加和queue一样的头文件
c++
1 |
|
访问
c++
1 | top()//访问优先级最高的元素 |
函数
c++
1 | push(x);//将x入队 |
优先级
基本数据类型
一般是数字大的优先级高,定义如下
c++
1 | priority_queue<int> q; |
想让数字小的优先级大只需
c++
1 | priority_queue<int,vector<int>,greater<int>> q; |
结构体类型
在结构体里面重载小于号即可
c++
1 | struct fruit{ |
这样之后f1<f2就等价于f1.price<f2.price
再定义fruit类型的优先队列,内部就是以价格高的水果为优先级高
也可以把重载函数写在结构体外面
c++
1 | struct cmp{ |
stack
栈,后进先出的容器,使用前需加上头文件
c++
1 |
|
访问
c++
1 | top()//访问栈顶元素 |
函数
c++
1 | push(x);//将x入栈 |
pair
把两个元素绑在一起作为一个合成元素,可以看成有两个元素的结构体
定义
c++
1 |
|
访问
c
1 | pair.first//访问第一个元素 |
比较
两个pair类型比较是先比较first再比较second
algorithm
使用前需添加头文件
c++
1 |
|
sort
c++
1 | sort(首元素地址,尾元素地址,比较函数(非必填));;//默认从小到大排序 |
如果需要从大到小,则需要使用比较函数
c++
1 | bool bmp(int a,int b){ |
STL容器中,只有vector,string,deque可以用sort