简介

阅读 STL源码剖析

  1. STL6大组件的交互关系

    Container 通过 Allocator 取得数据存储空间, Algorithm 通过 Iterator 存取 Container 的内容, Functor(仿函数)可以协助Algorithm完成不同的策略变化, Adapter 可以修饰或嵌套Functor.

  2. GNU 的由来

GNU is not UNIX. UNIX 是闭源的.

  1. stl_config.h

根据编译器对C++进行了配置. 以宏定义的方式.

  1. 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 六大组件的交互关系的更多相关文章

  1. STL 六大组件 功能与运用

    STL 提供六大组件,彼此可以组合套用: 1 容器(containers):各种数据结构,如vector,list,deque,set,map,用来存放数据,从实现的角度来看,STL容器是一种clas ...

  2. STL —— STL六大组件

    注:以下内容摘自 http://blog.csdn.net/byxdaz/article/details/4633826 STL六大组件 容器(Container) 算法(Algorithm) 迭代器 ...

  3. [转贴]从零开始学C++之STL(一):STL六大组件简介

    一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...

  4. STL六大组件简介

    一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...

  5. STL六大组件之——迭代器这个东西

    迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素.迭代器其实类似于引用,指向容器中某一元素.换个方式来说,容器就是 ...

  6. STL六大组件之——容器知识大扫盲

    STL中的容器主要涉及顺序容器类型:vector.list.deque,顺序容器适配器类型:stack.queue.priority_queue.标准库中的容器分为顺序容器和关联容器.顺序容器(seq ...

  7. STL六大组件之——分配器(内存分配,好深奥的东西)

    SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,视之为“足够大”,便调用第一级配置器:当配置区小于1 ...

  8. STL六大组件之——适配器代表大会

    适配器也是一种常用的设计模式: 将一个类的接口转换为另一个类的接口,使得原本因接口不兼容而不能合作的两个类可以一起运作.STL提供三种适配器:改变容器接口的容器适配器.改变迭代器接口的迭代器适配器以及 ...

  9. STL六大组件之——算法小小小小的解析

    参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...

  10. STL六大组件之——仿函数偷窥

    仿函数(functor),就是使一个类或类模板的使用看上去象一个函数.其实现就是类或类模板中对operator()进行重载,这个类或类模板就有了类似函数的行为.仿函数是智能型函数就好比智能指针的行为像 ...

随机推荐

  1. springAPI对事物支持之XML式配置

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerData ...

  2. 关于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 ...

  3. Spring Ioc源码引入:什么是IoC,IoC解决了什么问题

    Spring Ioc源码引入:什么是IoC,IoC解决了什么问题 什么是IoC 用一个故事举例: 小陈想开一家咖啡店,于是独自创业.找咖啡豆供应商.买咖啡机.招员工,样样都要自己来.开店成本很高.后来 ...

  4. js技术之“input输入框转成下拉框,且保留可输入能力”

    一.jsp前端控件 <td class="form-label"> <label class="control-label">供货商货号 ...

  5. Flex布局-margin 妙用技巧

    在 flex 布局 中, 通过对子项设置 margin-auto; 的方式去吃掉剩余空间, 这种小技巧在很多时候能极大简化我们的布局哦. 单元素水平垂直居中 如果父容器是 flex, 要实现元素水平垂 ...

  6. vue3 基础-应用app和组件基本概念

    这篇主要对 vue 最基础的应用程序 Application 和组件 Components 进行一个简要和直观的认知, 具体要分析的代码如下: <!DOCTYPE html> <ht ...

  7. 回顾-生成 vs 判别模型-和图

    直觉认识 生成模型, 通过训练的模型, 可以求出 p(x|y), 即生成模型的本质是通过旧样本->模型 -> 新样本, 通过某种概率分布, 能自己生成样本, 这很厉害的. 判别模型, 就咱 ...

  8. 用 Tarjan 算法求解有向图的强连通分量

    图论中的连通性概念是许多算法与应用的基础.当我们研究网络结构.依赖关系或路径问题时,理解图中的连通性质至关重要.对于不同类型的图,连通性有着不同的表现形式和算法解决方案. 无向图与有向图的连通性 在无 ...

  9. # Mit 6.824 Raft实验 2A 2B

    Mit 6.824 Raft实验 2A 2B Author: Minghao Zhou 这个项目写了好久,从一点也看不懂开始,到最后debug就和回家一样自然,成就感还是很足的哈哈.看大佬的架构和代码 ...

  10. frp实现内网穿透访问内网多台Linux服务器

    本文主要记录笔者在使用frp实现内网穿透访问内网多台Linux服务器的全过程,包括公网服务器的配置.frp服务端.客户端的下载与配置,以及配置systmctl来实现系统级启停frp,并记录我遇到的一些 ...