C++ STL 六大组件的交互关系
简介
阅读 STL源码剖析
STL6大组件的交互关系
Container 通过 Allocator 取得数据存储空间, Algorithm 通过 Iterator 存取 Container 的内容, Functor(仿函数)可以协助Algorithm完成不同的策略变化, Adapter 可以修饰或嵌套Functor.GNU 的由来
GNU is not UNIX. UNIX 是闭源的.
- stl_config.h
根据编译器对C++进行了配置. 以宏定义的方式.
- partial specialization (偏特化设计)
简单来说, 如果单纯只用C++的模板来进行设计, 可能会出现对于指针的无法推到或者叽叽歪歪的问题.
#include <iostream>
using namespace std;
// 一般化设计
template<class I, class O>
struct testClass {
testClass() {cout << "I O" << endl;}
};
// 特殊化设计
template <class T>
struct testClass<T*, T*>
{
testClass() {
cout << "T*, T*" << endl;
}
};
// 特殊化设计
template <class T>
struct testClass<const T*, T*> {
testClass () {
cout << "Cosnt T*, T*" << endl;
}
};
int main() {
testClass<int, char> obj1;
testClass<int*, int*> obj2;
testClass<const int*, int *> obj3;
}
对于仿函数 functor 有一种方式是使用 重载 operator()实现
参考链接
https://www.cnblogs.com/yanglf/archive/2013/04/23/3037162.html
#include <iostream>
using namespace std;
template <class T>
struct pplus
{
T operator()(const T &x, const T &y) const
{
return x + y;
}
};
template <class T>
struct mminus
{
T operator()(const T &x, const T &y) const
{
return x - y;
}
};
int main()
{
pplus<int> plusobj;
mminus<int> minusobj;
//使用仿函数,就像使用函数一样
cout << plusobj(3, 5) << endl;
cout << minusobj(3, 5) << endl;
//直接产生仿函数的临时对象,并调用之
cout << pplus<int>()(43, 50) << endl;
cout << mminus<int>()(43, 50) << endl;
system("pause");
return 0;
}
重载 ++ 前置与后置
#include <iostream>
using namespace std;
class INT {
friend ostream& operator<<(ostream& os, const INT& i);
public:
INT(int i) : m_i(i) { };
// prefix : increment and then fetch
INT & operator++(){
++(this->m_i);
return *this;
}
// postfix : fetch and then increment
const INT operator++(int) {
INT temp = *this;
++(*this);
return temp;
}
// prefix : decrement and then fetch
INT & operator--(){
--(this->m_i);
return *this;
}
// postfix : fetch and then decrement
const INT operator--(int) {
INT temp = *this;
--(*this);
return temp;
}
int & operator*() const {
return (int&)m_i; // 将 const int 转为 non-const lvalue.
}
private:
int m_i;
};
ostream& operator<<(ostream& os, const INT& i) {
os << '[' << i.m_i << ']';
return os;
}
int main() {
INT I(5);
cout << I++;
cout << ++I;
cout << I--;
cout << --I;
cout << *I;
}
从这里也可以看出, 友元函数, 可以访问私有变量. 这就是友元函数的作用.
前置与后置的区别之一是有没有参数. 还有返回的对象是什么.
这样对于 那些模糊不清的 ++-- 有了更深刻的认识.
find 迭代器 start() end() 为什么是 [) 区间
template <class _InputIter, class _Tp>
inline _InputIter find(_InputIter __first, _InputIter __last,
const _Tp& __val,
input_iterator_tag)
{
while (__first != __last && !(*__first == __val)) // 只要指针不等于最后一个指针就开始迭代运行. 简介明了.
++__first;
return __first;
}
STL 的设计思维
将数据容器 和 算法 分开, 彼此独立设计, 最后再以胶着计 进行粘结.
最常用的迭代器相应型别有5中: value type, different type, pointer, reference, Iterator catagoly.
value type 是迭代器所指对象的类型.
different type 是两个迭代器之间的距离.
reference 返回值的萃取?
Item & operator*() const {return *ptr;} // referece
Iten * operator->() const {return ptr;} // pointer
迭代去被分成5类
input iterator: 这种迭代器所值得对象不允许外接改变
output iterator : 只允许写
Forward Iterator : 允许写入型算法 replace
bidirectionaliterator : 可以双向移动的.
Random Access Iterator: 涵盖所有的算术能力
C++ STL 六大组件的交互关系的更多相关文章
- STL 六大组件 功能与运用
STL 提供六大组件,彼此可以组合套用: 1 容器(containers):各种数据结构,如vector,list,deque,set,map,用来存放数据,从实现的角度来看,STL容器是一种clas ...
- STL —— STL六大组件
注:以下内容摘自 http://blog.csdn.net/byxdaz/article/details/4633826 STL六大组件 容器(Container) 算法(Algorithm) 迭代器 ...
- [转贴]从零开始学C++之STL(一):STL六大组件简介
一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...
- STL六大组件简介
一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...
- STL六大组件之——迭代器这个东西
迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素.迭代器其实类似于引用,指向容器中某一元素.换个方式来说,容器就是 ...
- STL六大组件之——容器知识大扫盲
STL中的容器主要涉及顺序容器类型:vector.list.deque,顺序容器适配器类型:stack.queue.priority_queue.标准库中的容器分为顺序容器和关联容器.顺序容器(seq ...
- STL六大组件之——分配器(内存分配,好深奥的东西)
SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,视之为“足够大”,便调用第一级配置器:当配置区小于1 ...
- STL六大组件之——适配器代表大会
适配器也是一种常用的设计模式: 将一个类的接口转换为另一个类的接口,使得原本因接口不兼容而不能合作的两个类可以一起运作.STL提供三种适配器:改变容器接口的容器适配器.改变迭代器接口的迭代器适配器以及 ...
- STL六大组件之——算法小小小小的解析
参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...
- STL六大组件之——仿函数偷窥
仿函数(functor),就是使一个类或类模板的使用看上去象一个函数.其实现就是类或类模板中对operator()进行重载,这个类或类模板就有了类似函数的行为.仿函数是智能型函数就好比智能指针的行为像 ...
随机推荐
- docker概述及镜像管理
dockers概述 docker官方网站 docker官网:https://www.docker.com/ docker镜像仓库:https://hub.docker.com/ 什么是docker? ...
- 通过phpstudy设置域名/直接修改Apache、nginx配置后域名不生效的问题
使用虚拟主机或则云服务器的新萌可能会遇到这样的的问题,通过phpstudy解析域名或者直接修改Apache.nginx配置后域名并没有生效,一遍遍的检测配置文件,没毛病啊-(随便说下:Apache是h ...
- ctf.show刷题记录_web(1-10)
ctf平台(ctfshow) `https://ctf.show/ 1.签到 解题:base64解码 ctfshow{0da357d0-359b-47e1-80dc-5c02212725e5} 2.w ...
- AI Agent核心技术揭秘:从理论到实践(中篇)
认知是成本最低的对冲. --张三思维进化论 回顾与展望:从认知到技术的桥梁 在上一篇文章中,我们探讨了AI Agent的概念.特征和与传统AI的本质区别.我们认识到,AI Agent不仅是对话工具,更 ...
- 联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南
引言 在数据孤岛与隐私保护需求并存的今天,联邦学习(Federated Learning)作为分布式机器学习范式,为医疗影像分析.金融风控.智能交通等领域提供了创新解决方案.本文将基于FATE框架与P ...
- Polarctf -- Re(1)
Polarctf之简单逆向 1. shell 用exeinfope查看下程序结构, 发现存在upx壳 用upx工具脱壳, upx.exe -d shell.exe 再使用IDAPro打开 #flag{ ...
- 网络编程:反应堆_I/O模型和多线程模型实现
多线程设计的几个考虑 在反应堆reactor框架设计中,main reactor线程是一个acceptor线程,这个线程一旦创建,会以event_loop形式阻塞在event_dispatcher的d ...
- centos安装certbot
一步一步来,官网的教程: yum install snapd systemctl enable --now snapd.socket ln -s /var/lib/snapd/snap /snap s ...
- VsCode+DeepSeek的AI编程助手初体验
前言 最近随着AI编程助手的兴起,我这个重度码农也想试着尝下鲜,看看他究竟有多厉害,会不会把我们都给取代了.Github Copilot大名鼎鼎,和微软全家桶重度绑定,但是使用价格不菲,并且使用它有一 ...
- 通过JS模板引擎实现动态模块组件(Vite+JS+Handlebars)
1. 引言 在上一篇文章<实现一个前端动态模块组件(Vite+原生JS)>中,笔者通过原生的JavaScript实现了一个动态的模块组件.但是这个实现并不完善,最大的问题就是功能逻辑并没有 ...