STL源码剖析 第二次温习 细节审核

临时对象的产生

  • 临时对象也叫做 无名对象,(使用pass by value的方式会引发copy的操作,于是产生一个临时的对象),造成效率的负担,但是可以可以制造一些临时对象
  • 在型别的后面 直接加上() 并可以指定初始数值,相当于调用型别的构造函数,但是不指定对象的名称
  • 临时对象一般常用于 仿函数和算法搭配上
  • 代码如下所示  print<int>的临时对象被传入 for_each函数中起作用,当for_each结束的时候,临时对象结束了他的生命
#include <vector>
#include <iostream>
#include <algorithm>template<typename T>
class print{
public:void operator()(const T&elem){  //operator 重载()std::cout <<elem << " ";}
};void print_function(int value){std::cout <<value << " ";
}int main(){int ia[6] = {0,1,2,3,4,5};std::vector<int>iv{ia,ia+6};std::for_each(iv.begin(),iv.end(),print<int>());    //使用模板类的方式
//    std::for_each(iv.begin(),iv.end(), print_function);}

静态常量整数成员在class内部 直接初始化

#include <vector>
#include <iostream>
#include <algorithm>template<typename T>
class print{
public:void operator()(const T&elem){  //operator 重载()std::cout <<elem << " ";}
};void print_function(int value){std::cout <<value << " ";
}template <typename T>
class testClass{
public:static const T static_const_data_i = 5;static T static_data_i;
};//对于模板中使用static变量初始化,这段代码不能省略 
template<typename T>
T testClass<T>::static_data_i = 0;int main(){testClass<int>temp;temp.static_data_i = 9;std::cout << testClass<int>::static_data_i << std::endl;std::cout << testClass<int>::static_const_data_i << std::endl;
}

递增/递减/解除引用 的运算符重载写法

#include <vector>
#include <iostream>
#include <algorithm>class INT{friend std::ostream& operator<< (std::ostream& os,const INT& i);
public:INT(int i):m_i(i){};//prefix:increment and then fetchINT& operator++(){++(this->m_i); //随着class的不同,这一行有不同的操作return *this;}const INT operator++(int){INT temp = *this;++(*this);return temp;}INT& operator--(){--(this->m_i);return *this;}const INT operator--(int){INT temp = *this;--(*this);return temp;}int & operator*() const{return (int &)m_i;}
private:int m_i;
};std::ostream& operator<<(std::ostream& os,const INT& i){os << '[' << i.m_i << ']' << " ";return os;
}int main(){INT I(5);std::cout << I++ ;// [5]std::cout << ++I; // [7]std::cout << I--; // [7]std::cout << --I; // [5]std::cout << *I;  //  5
}

前闭后开 区间表示法

  • STL算法需要使用一对迭代器(泛型指针)表示 区间,也就是操作的的范围,使用[first.,last)来表示;实际的范围是first 开始 到 last-1结束 
  • last指代的是 最后一个元素的下一个位置 
  • 使用的是 偏移一格 的标示法
template<class InputIterator,class T>
InputIterator find(InputIterator first,InputIterator last,const T& value){while(first != last && *first != value){++first;}return value;
}template<class InputIterator,class Function>
Function for_each(InputIterator first,InputIterator last,Function f){for (; first != last; ++first) {f(*first);}return f;
}

 函数回调 操作符( function call)

  • 函数调用操作(也就是左括号和右括号)  也可以被重载
  • STL算法 提供了两个版本,一个用于一般情况(比如按照递增序列进行排序)  ;一个用于特殊情况(按照用户指定的规则进行排序);用户指定的规则 是通过函数进行制定的
  • 先前 C语言时代 如果想将函数作为参数进行传递  只能使用函数指针的方式
#include <vector>
#include <iostream>
#include <algorithm>int fcmp(const void* elem1,const void* elem2){const int* i1 = (const int*) elem1;const int* i2 = (const int*) elem2;if (*i1 < *i2){return -1;}else if(*i1 == *i2){return 0;}elsereturn 1;}int main(){int ia[10] = {32,92,67,58,10,4,25,52,59,54};for (int i = 0; i < 10; ++i) {std::cout << ia[i] << " ";}qsort(ia,sizeof(ia)/sizeof (int), sizeof (int),fcmp);std::cout << std::endl;for (int i = 0; i < 10; ++i) {std::cout << ia[i] << " ";}
}
  • 函数指针有缺陷 无法维持自己的状态  也无法达到组件技术中的 可适配性,也就是无法再将 某些装饰条件 加诸其上而改变其状态
  • 因此STL使用仿函数的形式实现了所谓的策略,仿函数类似于函数,比如针对某个类的进行operator()重载 就成为了仿函数,如果需要将其转换为可配接的仿函数需要额外的努力
  • 这个例子 缺乏 可配接能力 的体现  将在第8章 详述
#include <vector>
#include <iostream>
#include <algorithm>//由于将operator()重载了 因此plus成为了一个仿函数
template <class T>
struct plus{T operator()(const T& x,const T& y)const{return x+y;}
};//由于将operator()重载了 因此minus成为了一个仿函数
template <class T>
struct minus{T operator()(const T& x,const T& y)const{return x-y;}
};int main(){//产生仿函数对象plus<int>plus_obj;minus<int>minus_obj;//以下使用仿函数就像使用一般函数一样std::cout << plus_obj(3,67) << std::endl;std::cout << minus_obj(67,3) << std::endl;//以下直接产生函数的临时对象(第一对小括号) 并进行调用(第二队小括号)//使用括号产生临时对象std::cout << plus<int>()(3,67) <<std::endl;std::cout << minus<int>()(67,3) << std::endl;
}

参考链接

  • c++类模板遇上static关键字_宿罪的博客-CSDN博客_static 模板
  • c++中ostream类的超详细说明 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 彩票游戏

题目 Math.random()获取随机数 Math.random()返回的是一个[0.0,1.0)的doule类型的数 所以&#xff0c;获取0-9&#xff1a;(int)Math.random()*10–> [0,10) 获取0-10&#xff1a;(int)Math.random()*101–> [0,11) 获取10-99&#xff1a;(int)Math.random()9010–> […

python异常处理_Python入门 断言与异常处理

一、断言断言&#xff0c;可以理解为判断是否断开的预言。assert 表达式 , 描述表达式为我们的预期结果&#xff0c;当表达式的结果为False时&#xff0c;抛出 AssertionError 异常&#xff0c;如无异常捕获程序遇到异常时直接结束运行。反之&#xff0c;表达式结果为True 程序…

百度关键词排名查询源码_章丘百度霸屏总部,关键词排名腾沃云

上海保沃腾沃云为您详细解读URiIr章丘百度霸屏总部的相关知识与详情&#xff0c;做网站SEO优化文章内容优化效果已经十分明显。内容的量量关于网站的整体量量很重要。通过关键字阐发&#xff0c;陈某们晓得需要环绕关键字编写网页。使您的内容的重要根底是您对网页筹算描述的卖…

密码学专题 数据填充的方式|序列加密的方式

电子密码本模式和加密分组链接模式的分组算法都要求加密输入的分组是固定长度 的&#xff0c;但是大多数输入明文可能都不是分组长度的整数倍&#xff0c;也就是说&#xff0c;最后一个分组一般来 说是不足一个分组长度的。为了使分组加密算法能够正常工作&#xff0c;通常使用…

win10此电脑不见了_教程 | win10总提示“你要允许此应用对电脑的修改吗”,如何关闭?...

在使用电脑的时候&#xff0c;你是否曾遇到过这样的情况&#xff0c;点击打开软件的时候&#xff0c;系统总是提示我们“你要允许此应用对你的设备进行修改吗&#xff1f;”难道是软件中病毒了吗&#xff1f;&#xff0c;这其实上并没有什么用处&#xff0c;只是系统无法判断软…

密码学专题 加密模式的选择|传输数据加密

分组加密模式和序列加密模式。它们之间最大的区 别在于分组加密模式每次对一组数据进行加密运算处理&#xff0c;而序列加密模式则逐位对数据进 行加密运算处理。事实上&#xff0c;在实际设计应用的算法中&#xff0c;并没有那么严格的区别&#xff0c;它们有可能是相互结合的…

微信公众号数据2019_2019年9月原创公众号排行榜数据报告出炉

西瓜数据发布 2019 年 9 月原创公众号排行榜&#xff0c;分别从西瓜指数、原创文章占比、周期内公众号发文次数、发文篇数、总阅读数、头条平均阅读数等方面展示公众号数据。榜单说明1、涉及榜单本期月榜截取 ①财经、②教育、③娱乐、④科技、⑤体育、⑥游戏、⑦文化、⑧美食、…

密码学专题 OpenSSL专题

OpenSSL总体架构 软件包分为三个主要的功能部分&#xff1a;密码算法库 、 SSL协议库及应用程序 MacOS&#xff0c;MS&#xff0c;OS/2及 VMS这几个目录&#xff0c;包含了在不同的 平台编译时的环境变量配置文件&#xff0c;在安装编译完成之后&#xff0c;这几个目录就没有作…

java 华氏温度转换为摄氏温度

题目 小明要到美国旅游&#xff0c;可是那里的温度是以华氏度为单位记录的。 它需要一个程序将华氏温度&#xff08;80度&#xff09;转换为摄氏度&#xff0c;并以华氏度和摄氏度为单位分别显示该温度。 公式&#xff1a;华氏温度&#xff08;摄氏温度-32&#xff09;/1.8 M…

hs控什么意思_凡尔赛文学 到底是什么?

点击蓝字关注我们XIE XIE NI DE XI HUAN|| 动漫 情头 耽美 闺蜜 男女头 句子控 壁纸 ||左句 凡尔赛文学野象&#xff1a;老是有人提知不知道凡尔赛文学&#xff0c;说实话我不太清楚网络时下流行的梗&#xff0c;也没有兴趣参与&#xff0c;我还是比较喜欢欧洲古典文学和后现…

密码学专题 openssl编译和安装

Configure 脚本文件 使得OpenSSL可以适应多种不同的系统平台和多达几十种不同的编译器。Configure指令还可以使OpenSSL在编译的时候具备组件的选择功能&#xff0c;比如可以选择支持或者不支持某种算法或者协议等&#xff0c;这使得OpenSSL具有很大的灵活性&#xff0c;比如在…

Python学习12 文件的读写

目标 文件的打开和关闭 mode缺省情况下表示只读r 文件的路径 前面加个r’,代表其中的转义字符不起作用 文件的打开方式 案例&#xff1a;实现文件拷贝的功能 将某一文件夹下的某一文件 保存在当前文件 所在目录。 import os #读取文件1 path./file.txt fileopen(path,…

密码学专题 openssl的基本概念

配置文件 配置文件是OpenSSL的一个基础结构组件&#xff0c;OpenSSL使用一组称为OpenSSLCONF的函数来读取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf&#xff0c;它集成了OpenSSL所要使用的配置文件选项的大部分内容。此外&#xff0c;OpenSSL还提供了其他一…

该工程中的宏被禁止_建筑劳务分包都能承担什么工程

来源&#xff1a;找法网建筑工程的承包单位&#xff0c;也就是总承包单位可以将部分建造工程分包给具有资质的施工单位&#xff0c;这是法律所允许的&#xff0c;但是禁止将建造工程进行转包。一、建筑劳务分包都能承担什么工程建筑劳务分包能承担什么工程要看分包单位的资质&a…

matlab用辛普森公式求积分_积分近似计算之辛普森公式

对于积分区间[a, b]&#xff0c;若则成立辛普森公式辛普森公式可看作是改良的梯形公式。梯形公式是以直线逼近实际曲线&#xff0c;而辛普森公式则以二次曲线(即抛物线)逼近。以二次曲线逼近实际曲线根据辛普森公式可得各积分小区间内的积分值如下式所示&#xff1a;其中于是&a…

密码学专题 文件编码格式

OpenSSL中虽然使用PEM作为基本的文件编码格式&#xff0c;但是&#xff0c;由于不同的对象其封装的标准格式不太一样&#xff0c;所以经常会导致读者产生迷惑。此外&#xff0c;OpenSSL也支持DER编码和过时的Netscape编码格式(NET)OpenSSL的编码是基于ASN.1标准的&#xff0c;A…

echarts 折线图 设置y轴最小刻度_【硬货】vue全家桶+Echarts+百度地图,搭建数据可视化系统...

作者丨夙言来源丨前端大牛爱好者(Web-2017)https://segmentfault.com/a/1190000018993981本文章篇幅略长&#xff0c;内容有点多&#xff0c;大佬可根据目录选择性查阅&#xff0c;新人可一步步来阅读。1、 前言1.1 业务场景突然接到产品说要做一个数据监控的系统。有线图、柱状…

密码学专题 文本数据库

应用概述 文本数据库是跟OpenSSL的CA应用程序紧密结合在一起的&#xff0c;它以文本的方式记录CA已经签发的证书的状态和摘要信息。这些状态信息可以用于跟证书库相关的一些操作&#xff0c;比如使用ca指令生成CRL主要就是读取这个文本数据库的信息作为参考。文本数据库就是普…

Python学习13 异常处理机制

概括 常见的异常 异常处理机制 可以多个异常放在元组里面 一旦产生异常&#xff0c;try后面的语句不会继续执行&#xff0c;会做异常处理 异常使用场景1 close应该放在finally中 异常使用场景2 finally关键字 会执行except后面的&#xff0c;报错

java 布隆过滤器_牛逼哄哄的布隆过滤器,到底有什么用?

Java技术栈www.javastack.cn打开网站看更多优质文章作者&#xff1a;CodeBear的园子www.cnblogs.com/CodeBear/p/10911177.html本文是站在小白的角度去讨论布隆过滤器&#xff0c;如果你是科班出身&#xff0c;或者比较聪明&#xff0c;又或者真正想完全搞懂布隆过滤器的可以移…