STL(标准模板库)六大组件、容器迭代器以及常用容器

一、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倍。

与数组的区别

数组是静态的,在定义时确定数组的大小;vector是动态的,添加元素时如果空间不足,会自动扩容。
API
赋值(=、.assign()、.swap())
元素个数(.size())、判空(.empty())和容量(.capacity())
存取元素([]、.at())、第一个元素(.front())、最后一个元素(.back())
插入(.push_back()、.insert())和删除(.pop_back()、.erase()、.clear())

迭代器

vector<int> v;
vector<int>::iterator it=v.begin();
for(;it!=v.end();it++){
        //操作  *it取值
}

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))

三、常用容器总结

vector 单端动态数组 随机访问迭代器 (重点)
比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次
的记录,但却不会去删除记录,因为记录是事实的描述。
数据结构:数组
deque:双端动态数组 随机访问迭代器
deque 的使用场景:比如排队购票系统,对排队者的存储可以采用 deque,支持头端
的快速移除,尾端的快速添加
stack栈容器 没有迭代器 先进后出
queue队列容器 没有迭代器 先进先出
list 链表容器 双向迭代器 (重点)
比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入
数据结构:双链表
set 容器 只有键值 键值不能重复 自动排序 只读迭代器
比如对手机游戏的个人得分记录的存储,存储要求从高 分到低分的顺序排列。
数据结构:红黑树
map容器: 键值-实值成对出现 键值不能重复 自动排序 只读迭代器 (重点)
比如按 ID 号存储十万个用户,想要快速要通过 ID 查找对应的用户。
数据结构:红黑树

四、常用容器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()获取键的元素个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值