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()进行重载,这个类或类模板就有了类似函数的行为.仿函数是智能型函数就好比智能指针的行为像 ...
随机推荐
- springAPI对事物支持之XML式配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerData ...
- 关于symfony报错: Oops An Error Occurred ,The server returned a “500 Internal Server Error“
symfony3.4 开发环境正常,生产环境访问任何路由都报错: Oops! An Error Occurred The server returned a "500 Internal Se ...
- Spring Ioc源码引入:什么是IoC,IoC解决了什么问题
Spring Ioc源码引入:什么是IoC,IoC解决了什么问题 什么是IoC 用一个故事举例: 小陈想开一家咖啡店,于是独自创业.找咖啡豆供应商.买咖啡机.招员工,样样都要自己来.开店成本很高.后来 ...
- js技术之“input输入框转成下拉框,且保留可输入能力”
一.jsp前端控件 <td class="form-label"> <label class="control-label">供货商货号 ...
- Flex布局-margin 妙用技巧
在 flex 布局 中, 通过对子项设置 margin-auto; 的方式去吃掉剩余空间, 这种小技巧在很多时候能极大简化我们的布局哦. 单元素水平垂直居中 如果父容器是 flex, 要实现元素水平垂 ...
- vue3 基础-应用app和组件基本概念
这篇主要对 vue 最基础的应用程序 Application 和组件 Components 进行一个简要和直观的认知, 具体要分析的代码如下: <!DOCTYPE html> <ht ...
- 回顾-生成 vs 判别模型-和图
直觉认识 生成模型, 通过训练的模型, 可以求出 p(x|y), 即生成模型的本质是通过旧样本->模型 -> 新样本, 通过某种概率分布, 能自己生成样本, 这很厉害的. 判别模型, 就咱 ...
- 用 Tarjan 算法求解有向图的强连通分量
图论中的连通性概念是许多算法与应用的基础.当我们研究网络结构.依赖关系或路径问题时,理解图中的连通性质至关重要.对于不同类型的图,连通性有着不同的表现形式和算法解决方案. 无向图与有向图的连通性 在无 ...
- # Mit 6.824 Raft实验 2A 2B
Mit 6.824 Raft实验 2A 2B Author: Minghao Zhou 这个项目写了好久,从一点也看不懂开始,到最后debug就和回家一样自然,成就感还是很足的哈哈.看大佬的架构和代码 ...
- frp实现内网穿透访问内网多台Linux服务器
本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置.frp服务端.客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些 ...