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 程序…

C++ 左值和右值 的学习

引用是一个变量&#xff0c;它引用其他变量的内存位置 int x 34; int &lRef x; 标识符 IRef 就是一个引用。在声明中&#xff0c;引用是通过 & 来指示的&#xff0c;出现在类型与变量的标识符之间&#xff0c;这种类型的引用称为左值引用左值看作是一个关联了名称的…

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

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

java 结婚问题

题目 大家都知道&#xff0c;男大当婚&#xff0c;女大当嫁。那么女方家长要嫁女儿&#xff0c;当然要提出 一定的条件&#xff1a;高&#xff1a;180cm以上&#xff1b;富&#xff1a;财富1千万以上&#xff1b;帅&#xff1a;是。 如果这三个条件同时满足&#xff0c;则&…

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

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

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

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

java 小时转换为xx天xx小时

题目 为抵抗洪水&#xff0c;战士连续作战89小时&#xff0c;编程计算共多少天零多少小时&#xff1f; 代码 使用/与% class ExchangeTime {public static void main(String[] args) {/*为抵抗洪水&#xff0c;战士连续作战89小时&#xff0c;编程计算共多少天零多少小时&a…

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

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

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

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

java 求100天之后是周几

题目 今天是周二&#xff0c;100天以后是周几&#xff1f; 代码 代码1&#xff1a;减去天数&#xff0c;使循环从周一开始 //方法1&#xff1a;减去天数&#xff0c;使循环从周一开始int today2;//7天一个循环&#xff1a;3 4 5 6 7 1 2 3 4 5 6 7int after100;//(100-5)%…

密码学专题 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…

python实验练习-类的多继承

题目 1、概述&#xff1a; 完成学生&#xff0c;组长&#xff0c;教师的设计与实现。 2、具体实现内容&#xff1a; 学生&#xff1a; 姓名&#xff0c; 年龄&#xff0c; 学号 吃饭&#xff0c; 睡觉&#xff0c; 学习 组长&#xff1a; 姓名&#xff0c; 年龄&#xff0c; 学…

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

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