STL(常用)
STL
- 简单记录、讲解一些初级阶段常用的用法。
STL是C++的一个标准模板库,其中包含了许多在计算机领域常用的基本数据结构以及基本算法。STL主要依赖于模板,使得STL具有广泛的通用性。这篇文章旨在介绍一些常用的STL工具及其用法。
Algorithm
- 该头文件涉及许多常用的功能,例如比较、交换、查找、遍历、绝对值、复制、修改、反转、排序等。
具体用法
/**
稍微列举部分可能用到的
**/
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main () {
//排序
int a[5] = {5, 1, 2, 3,7};
sort (a, a+5);
// stable_sort (a, a+5);
for (int i = 0; i < 5; i++)
cout << a[i] << " ";
cout << endl;
// 反转
reverse(a, a+5);
for (int i = 0; i < 5; i++)
cout << a[i] << " ";
cout << endl;
// 绝对值
cout << abs(-5) << endl;
// 最大值最小值
cout << max(5, 3) << " " << min(5, 3) << endl;
// 交换
int x = 1, y = 2;
swap (x, y);
cout << x << " " << y << endl;
// 赋值函数fill
int b[4] = {1, 2, 3, 4};
fill (b, b+4, -1);
for (int i = 0; i < 4; i ++)
cout << b[i] << " ";
cout << endl;
//求全排列的下一个顺序, next_permutation若有下一个全排列返回true没有则返回false
char str[3] = {'a', 'b', 'c'};
do {
cout << str << endl;
}while (next_permutation(str, str+3));
//.....
return 0;
}
Container
vector
vector这个容器实际上是加强版的数组。数组在定义的时候长度就被确定下来了,但是vector容器随着添加的数据量增加,它的长度也会随之增加。容器可以存个种类型的数据。
使用时包含头文件#include
初始化(常用)
vector<int> vec; // 整型
vector<char> vec1; // 字符型
int b[4] = {1, 2, 3, 4};
vector<int> a(b, b+4); // 用数组赋值
vector<int> c(10); // 10个长度的整型
vector<int> c1(10, 1); // 10个长度的整型,且每个元素为1
vector<int> c2(c) // 用c赋值创建c2
常用函数方法
方法 | 作用 |
---|---|
vec.push_back() |
在vector末尾添加一个元素 |
vec.begin() vec.end() |
返回vector首尾迭代器 |
vec.front() vec.back() |
返回vector首尾元素 |
vec.size() |
返回vector中元素的个数 |
vec.pop_back() |
删除vector最后一个元素 |
vec.capacity() |
返回内存中总共容纳的元素个数 |
vec.empty() |
返回1表示空,0表示不为空 |
vec.clear() |
清空vector |
vector容器也可通过[]方式来访问,第一个下标和数组相同是0,例如vec[0]。
stack
stack翻译过来是栈的意思,是一种基础的数据结构。它的特点是先进后出,栈中可以存放各种数据类型,也包括自定义的数据类型。
声明:#include <stack>
使用栈,需要知道一个几个概念
- 栈顶:栈顶部的元素(进出栈都必须经过栈顶)
- 进栈:进入栈中(压栈)
- 出栈:从栈中出去(弹栈)
初始化(常用)
stack<int> s;
stack<char> t;
struct node {
...
};
stack<node> n;
常用函数方法
方法 | 作用 |
---|---|
s.top() |
返回栈顶元素 |
s.empty() |
判断为空返回1,否则0 |
s.size() |
返回栈中元素个数 |
s.push() |
压栈 |
s.pop() |
弹栈 |
queue
queue表示队列,是一种基本数据结构。特点是先进先出,想象成排队买票的过程,先排队的先买票,后排队的后买票。
声明:#include <queue>
初始化(常用)
queue<int> s;
queue<char> t;
struct node {
...
};
queue<node> n;
常用函数方法
方法 | 作用 |
---|---|
q.front() q.back() |
返回队首、队尾元素 |
q.empty() |
判断为空返回1,否则0 |
q.size() |
返回队列长度 |
q.push() |
从队尾添加一个元素 |
q.pop() |
从队首删除一个元素 |
清空队列只能一个一个弹出。另外,队列是不能随机访问的。
priority_queue
priority_queue也是队列的一种,是优先队列。普通的队列是一种先进先出的数据结构,但是优先队列中的元素被赋予了优先级,优先级高的元素排在队列前,优先出队列。优先级的规则可以由自定义。
优先队列具有所有队列的基本操作,本质上是一个堆。默认是大顶堆,降序序列。
声明:
#include <queue>
初始化(常用)
priority_queue <int> q; // 默认从大到小
struct node {
...
};
priority_queue <node> q1;
priority_queue <int, vector<int>, greater<int> > t; // 小顶堆,从小到大
常用函数方法
方法 | 作用 |
---|---|
q.empty() |
判断为空返回1,否则0 |
q.size() |
返回队列长度 |
q.push() |
从队尾添加一个元素 |
q.pop() |
从队首删除一个元素 |
q.top() |
访问队首元素 |
自定义优先级
需要注意的是,优先队列模板中带3个参数,priority_queue<Type, Container, Functional>。Type表示数据类型,Container表示存储数据的容器,Functional为元素的比较方式。后两个参数可以不写,Container默认是Vector,比较方式默认的是operator <,即大顶堆,降序。
对于自定义的数据结构,需要自定义排序规则,那么就需要重写operator<。
struct node {
int x, y;
node (int x1, int y1):x(x1), y(y1) {}
};
// 小顶堆
bool operator < (node a, node b) {
if (a.x == b.x) return a.y > b.y; // x相等,按照y从小到大升序
return a.x > b.x; // x大的优先级低,按照x从小到大升序
}
//大顶堆
bool operator < (node a, node b) {
if (a.x == b.x) return a.y < b.y; // x相等,按照y从大到小升序
return a.x < b.x; // x小的优先级低,按照x从大到小升序
}
//小顶堆,写在结构体内部
struct node {
int x, y;
node (int x1, int y1):x(x1), y(y1) {}
bool operator < (const node &a) const { //小顶堆,按照x升序
if (x == a.x) return y > a.y;
return x > a.x;
}
};
priority_queue <node> q;
也可以自定义比较函数cmp,作为第3个参数,此时容器参数不能省略
struct node {
int x, y;
node (int x1, int y1):x(x1), y(y1) {}
};
struct cmp {
bool operator() (node a, node b) {
if (a.x == b.x) return a.y > b.y;
return a.x > b.x;
}
};
priority_queue <node, vector<node>, cmp > q;
deque
deque是一种双端队列,普通的队列是先进先出,而双端队列既可以从队首进出,也可以从队尾进出。
而deque和queue不同的地方在于,可以通过下标访问其中的元素,也就是支持随机访问。
初始化(常用)
#include <queue>
struct node {
...
};
deque<int> a;
deque<node> b;
常用函数方法
方法 | 作用 |
---|---|
q.push_front() q.push_back() |
在队首、队尾插入元素 |
q.front() q.back() |
获取队首、队尾元素 |
q.pop_front() q.pop_back() |
队首、队尾出队一个元素 |
q.begin() q.end() |
返回队首、队尾的迭代器 |
q.clear() |
清空队列 |
set
set可以理解成一个集合,这个集合的特点就是其中的元素无重复。假定集合中已有一个元素,那么添加相同的元素进去是无效的,还是只有那一个唯一的元素。同时set中的元素是默认升序的。(红黑树实现)
初始化(常用)
#include <set>
queue<int> s;
queue<char> t;
struct node {
...
};
queue<node> n;
常用函数方法
方法 | 作用 |
---|---|
s.begin() s.end() |
返回集合首尾迭代器 |
s.insert(k) |
集合中插入元素k |
s.erase(k) |
集合中删除元素k |
s.size() |
返回集合元素个数 |
s.empty() |
判断集合是否为空 |
s.clear() |
清空集合 |
map
map是一种关联容器,提供数据一种一对一的映射关系(每一个元素都有一个唯一的关键字,这个关键字对应一个键值)。map也是红黑树实现的,它的好处在于可以快速方便的增加、删除、查找、遍历等。
初始化(常用)
map <int, char> m;
m.insert(pair<int, char>(65, 'A'));
m.insert(map<int, char>::value_type (66, 'B'));
m[67] = 'C';
使用insert方法插入时,会保证key(map中的第一个参数)的唯一性,有相同的key值插入是不会成功的。
但是m[67] = 'C',这种方式会直接造成覆盖。
常用函数方法
方法 | 作用 |
---|---|
m.begin() m.end() |
返回第一个和最后一个迭代器位置 |
m.insert(map<Type, Type>::value_type()) |
插入元素,包含关键字和对应值 |
m.count(k) |
查看关键字为k的元素个数(map特性,只能为0或者1) |
m.find(k) |
查关键字为k元素,有返回迭代器位置没有返回end位置 |
m.erase() |
可根据关键字、迭代器删除(也可成片删除) |
m.lower_bound() m.upper_bound() |
返回键值>=、<=给定元素的第一个迭代器位置 |
m.size() |
返回map中元素个数 |
m.clear() |
删除所有元素 |
Iterator
简单来说,可以用于迭代遍历STL中各种容器的数据类型。
类似于指针,可以指向要访问的索引的值。
简单用法
/**
遍历set、map等
**/
#include <iostream>
#include <map>
#include <set>
#include <iterator>
using namespace std;
int main () {
map <int, char> m;
map <int, char>::iterator it;
m.insert(map<int, char>::value_type (66, 'B'));
m.insert(pair<int, char>(65, 'A'));
m[67] = 'C';
for (it = m.begin(); it != m.end(); it++)
cout << it->first << " " << it->second << endl;
cout << endl;
vector<int> v;
vector<int>::iterator it_v;
for (int i = 1; i <= 10; i++)
v.push_back(i);
for (it_v = v.begin(); it_v != v.end(); it_v++)
cout << *it_v << " ";
cout << endl;
set <int> s;
set <int>::iterator it_s;
for (int i = 1; i <= 10; i++)
s.insert(i);
for (it_s = s.begin(); it_s != s.end(); it_s++)
cout << *it_s << " ";
cout << endl;
return 0;
}
-------------------------------------
// 可以进行查找等
#include <iostream>
#include <map>
using namespace std;
int main () {
map <int, char> m;
map <int, char>::iterator it;
m.insert(map<int, char>::value_type (66, 'B'));
m.insert(pair<int, char>(65, 'A'));
m[67] = 'C';
it = m.find(66);
if (it != m.end())
cout << it->first << " " << it->second;
return 0;
}
STL(常用)的更多相关文章
- C++ STL 常用算术和生成算法
C++ STL 常用算术和生成算法 accumulate() accumulate: 对指定范围内的元素求和,然后结果再加上一个由val指定的初始值. #include<numeric> ...
- C++ STL 常用拷贝和替换算法
C++ STL 常用拷贝和替换算法 copy() 复制 vector<int> vecIntA; vecIntA.push_back(1); vecIntA.push_back(3); v ...
- C++ STL 常用排序算法
C++ STL 常用排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. 例如: vecIntA,vecIntB,vecIntC是用ve ...
- C++ STL 常用查找算法
C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...
- C++ STL 常用遍历算法
C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了 ...
- STL常用结构与方法简明总结
C++常用的数据结构 序列式容器 vector(向量.有序数列),list(双向链表),deque(双端队列) 适配器容器 stack(栈),queue(队列) 关联式容器 map(映射.键值对二叉树 ...
- STL常用序列容器
这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...
- C++STL 常用 函数 用法
学完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写. 后来我发现了qt,opencv,opengl,原来,c++好玩的狠. 在 ...
- C++中STL常用容器的优点和缺点
我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...
- C++ STL常用容器浅析
首先要理解什么是容器,在C++中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器.简单来说 容器就是包含其他类的对象们的对象,当然这种(容器) ...
随机推荐
- List 集合的操作
如果当前id存在集合里 去除当前id 如果不在集合里 去除集合最后一个结果Long videoId = 0l; // 当前 IDList<VideoZoneReturnBean> ...
- 题解 洛谷P3469
题目每个割点去掉后会导致多少对点不能连通 考虑跑Tarjan的时候记录每个儿子的size,那么去掉这个割点后其他的点都不能和这个儿子连通 注意每个点去掉后它本身就不能与其他所有点连通 还有就是题目里求 ...
- 《Java从入门到失业》第二章:Java环境(一):Java SE安装
从这一章开始,终于我们可以开始正式进入Java世界了.前面我们提到过,Java分三个版本,我们这里只讨论Java SE. 2.1Java SE安装 所谓工欲善其事,必先利其器.第一步,我们当然是要下载 ...
- Android Failed to find layer (XXX/XXX.xxActivity#0) in layer parent (no-parent).
报错: Failed to find layer (XXX/XXX.xxActivity#0) in layer parent (no-parent). 解决: 将该xxActivity复制一份到桌面 ...
- Typescript node starter 3. App Router Controller
Request request对象表示HTTP请求,并具有请求query字符串.参数.body.HTTP headers等的属性.除了添加新的属性和方法外,还包含原型的属性和方法. 随着系列文章的发布 ...
- linux驱动之内核多线程(三)
本文摘自 http://www.cnblogs.com/zhuyp1015/archive/2012/06/13/2548458.html 接上 一篇文章 ,这里介绍另一种线程间通信的方式:compl ...
- 牛客网PAT练习场-个位数的统计
思路:每接受一个字符,便统计一次即可 题目地址:https://www.nowcoder.com/questionTerminal/a2063993dd424f9cba8246a3cf8ef445 # ...
- Java多线程_并发容器ConcurrentHashMap/CopyOnWriteArrayList/CopyOnWriteArraySet
ConcurrentHashMap HashMap是线程不安全的,可以使用Collections.synchronizedMap(map)把一个不安全的map变成安全的,但是这里可以直 ...
- 黑马新版PYTHON教学课程(全)资料加视频完整版百度网盘资料
黑马新版PYTHON教学课程(全)资料加视频完整版 无加密,适合0基础人群.基础班+就业班.不用解压在线看 百度网盘地址一 淘宝店地址二
- Mysql安装错误
[问题一]在安装mysql时遇到以下错误 执行./mysqld --initialize 后 ./bin/mysqld: error while loading shared libraries: l ...