C/C++之STL学习笔记

学习记录

STL是指C++ 的标准模板库( Standard Template Library)。从广义上分为: 容器(container)、算法(algorithm)、迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。

STL六大组件简述

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法[^1] 功能;
  6. 增加了 多屏幕编辑 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; // 越小的整数优先级越低的队列

参考

1、【C/C++】STL详解
2、【C/C++】STL学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值