学习记录
STL是指C++ 的标准模板库( Standard Template Library)。从广义上分为: 容器(container)、算法(algorithm)、迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。
STL六大组件简述
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法[^1] 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
三大组件
一个简单的表格是这么创建的:
1、容器
使用:---------:
居中
2、算法
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
3、迭代器
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
常用容器
1、set
(1)set是一种关联式容器,用来存储同一数据类型的数据结构。基本功能与数组相似。
(2)set的元素不像map那样可以同时拥有实值和键值,set的元素既是键值又是实值。
(3)与数组不同的是,set中每个元素的值都是唯一的,不允许插入重复值,而multiset允许插入相同的数据。
PS:multiset功能与set相似,接口也基本一样,底层是红黑树。区别是,multiset允许键值重复,而set不允许数据冗余。
(4)插入数据时,能够根据元素的值自动被排序(默认升序)。
(5)set中元素值不能直接被改变。不可以通过set的迭代器改变set元素的值,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator。
头文件:
#include<set>
常用API:
// set构造函数
set<Type> s; // set默认构造函数:
set<int> s // 定义一个set容器 类型为int型
mulitset<Type> mst; // multiset默认构造函数:
set(const set &st); // 拷贝构造函数
// set赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
// 大小(s为set的变量名)
s.max_size() // 返回set容器可能包含的元素最大个数
s.size() // 返回容器中元素的数目
s.empty() // 判断容器是否为空。如果集合为空,返回true
s.count() // 返回bool型,有返回1,无返回0
// 插入
s.insert(elem) // 在集合中插入元素
// 删除
s.clear() // 清除所有元素
s.erase(pos) // 删除pos迭代器所指的元素,返回下一个元素的迭代器。
s.erase(beg, end) // 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
s.erase(elem) // 删除容器中值为elem的元素。
// 查找
s.count(key) // 查找键key的元素个数
s.begin() // 返回指向第一个元素的迭代器
s.end() // 返回指向最后一个元素之后的迭代器,不是最后一个元素
s.find() // 查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end()。(最后一个元素的下一个位置)
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
指定set排序规则举例:
//插入操作返回值
void test01(){
set<int> s;
pair<set<int>::iterator,bool> ret = s.insert(10);
if (ret.second){
cout << "插入成功:" << *ret.first << endl;
}
else{
cout << "插入失败:" << *ret.first << endl;
}
ret = s.insert(10);
if(ret.second){
cout << "插入成功:" << *ret.first << endl;
}
else{
cout << "插入失败:" << *ret.first << endl;
}
}
struct MyCompare02{
bool operator()(int v1,int v2){
return v1 > v2;
}
};
//set从大到小
void test02(){
srand((unsigned int)time(NULL));
//我们发现set容器的第二个模板参数可以设置排序规则,默认规则是less<_Kty>
set<int, MyCompare02> s;
for (int i = 0; i < 10;i++){
s.insert(rand() % 100);
}
for (set<int, MyCompare02>::iterator it = s.begin(); it != s.end(); it ++){
cout << *it << " ";
}
cout << endl;
}
//set容器中存放对象
class Person{
public:
Person(string name,int age){
this->mName = name;
this->mAge = age;
}
public:
string mName;
int mAge;
};
struct MyCompare03{
bool operator()(const Person& p1,const Person& p2){
return p1.mAge > p2.mAge;
}
};
void test03(){
set<Person, MyCompare03> s;
Person p1("aaa", 20);
Person p2("bbb", 30);
Person p3("ccc", 40);
Person p4("ddd", 50);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for (set<Person, MyCompare03>::iterator it = s.begin(); it != s.end(); it++){
cout << "Name:" << it->mName << " Age:" << it->mAge << endl;
}
}
结构体类型(struct )的set ,使用时必须要重载 ‘<’ 运算符:
#include<iostream>
#include<set>
#include<string>
using namespace std;
struct Info
{
string name;
double score;
bool operator < (const Info &a) const // 重载“<”操作符,自定义排序规则
{
//按score由大到小排序。如果要由小到大排序,使用“>”即可。
return a.score < score;
}
};
int main()
{
set<Info> s;
Info info;
//插入三个元素
info.name = "Jack";
info.score = 80;
s.insert(info);
info.name = "Tom";
info.score = 99;
s.insert(info);
info.name = "Steaven";
info.score = 60;
s.insert(info);
set<Info>::iterator it;
for(it = s.begin(); it != s.end(); it++)
cout << (*it).name << " : " << (*it).score << endl;
return 0;
}
// 不用迭代器也可以:for(int n:s) cout<<n<<ends;
/*
运行结果:
Tom : 99
Jack : 80
Steaven : 60
*/
2、vector
3、queue
queue
Queue是一种先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。
(1)先进先出(First In First Out,FIFO)。
(2)只有queue的顶端元素,才有机会被外界取用。
(3)Queue不提供遍历功能,也不提供迭代器。
头文件:
#include<queue>
常用API:
// queue构造函数
queue<Type> q; // queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que); // 拷贝构造函数
// queue赋值操作
queue& operator=(const queue &que); // 重载等号操作符
// queue存取、插入和删除操作
push(elem); // 往队尾添加元素
pop(); // 从队头移除第一个元素
back(); // 返回最后一个元素,但不删除
front(); // 返回第一个(队首)元素,但不删除
// queue大小操作
empty(); // 判断队列是否为空,空true,非空false
size(); // 返回队列的大小(元素个数)
priority_queue
(1)优先队列具有队列的所有特性,包括基本操作,和queue不同的就在于可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
(2)在内存充足的情况下,优先队列能被无限地插入元素。
头文件:
#include<queue>
常用API:
// queue构造函数
priority_queue<Type> pq;
empty() // 队列是否为空
pop() // 弹出队头元素
push() // 插入元素到队尾 (并排序)
top() //访问(具有最高优先级的)队头元素
size() // 返回队列中元素个数
// 其中:
priority_queue<Type> pq; // 越小的整数优先级越低的队列