一、STL六大组件
1.容器
作用
分类
序列式容器(vector,deque/queue,list)
关联式容器(set/multiset,map/multimap)
序列式容器与关联式容器的区别
序列式容器:强调值的排序,每个元素均有固定的位置,除非用删除和插入的操作改变这个位置。
关联式容器:非线性,不强调值的排序,准确的说是二叉树结构。
2.算法
分类
质变算法(如 拷贝、替换、删除)
含义
运算过程中会更改区间内元素的内容。
非质变算法(如 查找、计数、遍历、寻找极值)
含义
运算过程中不会更改区间内元素的内容。
3.迭代器
作用
分类
输入迭代器(只读访问,支持++、==、!=)
输出迭代器(只写访问,支持++)
前向迭代器(读写访问,支持++、==、!=)
双向迭代器(读写访问,支持++、--)
随机访问迭代器(跳跃式访问任意数据)
4.仿函数
作用
5.适配器
作用
扩展-设计模式之适配器模式
含义
将一个接口转换成另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。它既可以作为类结构型模式,也可以作为对象结构型模式。
角色
目标接口(Target)
该角色把其他类转换为我们期望的接口,可以是一个抽象类或接口,也可以是具体类。
被适配者(Adaptee)
原有的接口,也是希望被适配的接口。
适配器(Adapter)
将被适配者和目标接口组合到一起的类。
实现方法
增加一个新的适配器类。
示例
#include <iostream>
// 目标接口
class MediaPlayer {
public:
virtual ~MediaPlayer() {}
virtual void playSound() = 0;
virtual void playVideo() = 0;
};
// 适配者:MP3 播放器
class MP3Player {
public:
void play() {
std::cout << "Playing MP3 file." << std::endl;
}
};
// 适配器:将 MP3Player 适配为 MediaPlayer 接口
class MP3PlayerAdapter : public MediaPlayer {
private:
MP3Player mp3Player;
public:
void playSound() override {
mp3Player.play();
}
// MP3Player 不能播放视频,所以返回一个空实现
void playVideo() override {
std::cout << "MP3 Player cannot play video." << std::endl;
}
};
// 客户端代码
int main() {
MediaPlayer* player = new MP3PlayerAdapter();
player->playSound(); // 使用适配器的 playSound 方法
player->playVideo(); // 尝试使用适配器的 playVideo 方法
delete player; // 清理资源
return 0;
}
6.空间配置器
作用
二、常用容器
string
API
赋值(=、.assign())
字符串长度(.size()、.length())
存取字符([]、.at())
拼接字符串(+=、.append())
查找(.find()、.rfind())和替换(.replace())
比较(.compare())和截取(.substr())
插入(.insert())和删除(.erase())
转char*(.c_str())
vector
概述(连续开辟,单向开口,随机访问迭代器,数据结构:数组)
未雨绸缪机制
添加元素时如果空间不足,会自动扩容为原来的2倍。
与数组的区别
API
赋值(=、.assign()、.swap())
元素个数(.size())、判空(.empty())和容量(.capacity())
存取元素([]、.at())、第一个元素(.front())、最后一个元素(.back())
插入(.push_back()、.insert())和删除(.pop_back()、.erase()、.clear())
迭代器
stack(栈(水桶),先进后出)
概述(单向开口、没有迭代器)
赋值(=)
元素个数(.size())和判空(.empty())
栈顶元素(.top())
栈顶插入(.push())和栈顶删除(.pop())
queue(队列(水管)、先进先出)
概述(双向开口,没有迭代器)
赋值(=)
元素个数(.size())和判空(.empty())
队尾插入(.push())和队头删除(.pop())
第一个元素(.front())、最后一个元素(.back())
deque
概述(双向开口的连续线性空间,分段连续空间组合而成)
赋值(=、.assign()、.swap())
存取元素([]、.at())、第一个元素(.front())、最后一个元素(.back())
元素个数(.size())和判空(.empty())
插入(.push_back()、.push_front ()、.insert())和删除(.pop_back()、.pop_front()、.erase()、.clear())
list
概述(离散存储、双向迭代器、元素可重复,数据结构:双链表)
赋值(=、.assign()、.swap())
第一个元素(.front())、最后一个元素(.back())
元素个数(.size())和判空(.empty())
插入(.push_back()、.push_front ()、.insert())和删除(.pop_back()、.pop_front()、.erase()、.remove()、.clear())
反转(.reverse())和排序(.sort())
set/multiset
概述(自动升序排序、set不允许键重复,数据结构:红黑树)
赋值(=、.swap())
元素个数(.size())和判空(.empty())
插入(.insert())和删除(.erase()、.clear())
查找键(.find(key))和查找键的元素个数(.count(key))
map/multimap
概述(键值对、自动键升序排序、map不允许键重复,数据结构:红黑树)
赋值(=、.swap())
元素个数(.size())和判空(.empty())
插入(.insert())和删除(.erase()、.clear())
查找键(.find(key))和查找键的元素个数(.count(key))
三、常用容器总结
四、常用容器API总结
长度/个数:size()通用于所有容器,string还可用length(),除string以外的容器还可用empty()判空。
存取:string、vector、deque可用[下标]和at();vector、queue、deque、list可用front()、back()得到第一/最后一个元素。
插入/删除:除stack、queue以外的容器适用insert()、erase();vector、deque、list适用push_back()、pop_back();deque、list还适用push_front()、pop_front();stack、deque适用push()、pop();除string、queue、deque以外的容器适用clear()。
查找:string、set/multiset、map/multimap适用find()。
特有:string适用compare()和substr();vector适用capacity();stack适用top()获取栈顶素; list适用reverse()反转和sort()排序;set/multiset、map/multimap适用count()获取键的元素个数。
2万+

被折叠的 条评论
为什么被折叠?



