零:使用STL自带的函数(less与greater) vector<int> v{45,2,5,8454,34,68421,5,84,1,5}; sort(v.begin() ,v.end(),less<int>());//从小到大 sort(v.begin() ,v.end(),greater<int>());///从大到小 一:普通比较函数 假设有一个vector<<\string>>,你的任务是统计长度小于5的string的个数,如果使用count_if 函数的话,代码就是这样: bool LengthIsLessThanFive(const string& str) { return str.length() < 5; } int res=count_if(vec.begin(), vec.end(), LengthIsLessThanFive); 继续阅读 >>


刘生玺 18/05/24 18:05:04
一:打印 Hello World DATA SEGMENT BUF DB 'HELLO WORLD! THIS IS MY FIRST ASM FILE! $' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 小记: 1. 字符串的最后一个字符必须是“$” 2. LEA DX,BUF 等价于 MOV DX,OFFSET BUF 3.通过功能号为 9 的DOS功能调用实现字符串的显示 09H 显示字符串 01H 单个字符的输入 02H 单个字符的输出 二:计算 继续阅读 >>


刘生玺 18/05/16 15:22:38
提问: 1.为什么要搞出四种,用原先使用的那种不可以吗? 答:因为强制类型转换时是具有一定的风险的,这种风险包括(精度的损失 ,派生类与基类的一些转换关系) 而且根据风险程度的不同导致的 bug 也会不同 ,再加上存在许多种类型之间的转换 , 所以C++选择将其分为四种 。 2.这样分类之后又有什么好处呐? 答:关于这个问题,让我们来设想一个场景。假如你现在知道你的bug 是因为指针类型之间的转换所导致的 ,那你现在就必须得定位它/它们 ,如果还用以前的那种方式,就会找到许多无关于这次需求的东西,如果使用C++的这种方式,你只需要去找所对应的 _cast 就行了 。很方便吧 :) 四种强制类型转换:static_cast , interpret_cast ,const_cast和 dynamic_cast (1)static_cast <1>适用:用来进行比较“自然”和低风险的转换 。比如:整型与实数,字符型之间的转换 <2>不适用:不同类型指针, 继续阅读 >>


刘生玺 18/05/10 15:47:29
在C++11中,callable object 包括传统C函数,C++成员函数,函数对象(实现了()运算符的类的实例),lambda表达式(特殊函数对象)共4种。程序设计,特别是程序库设计时,经常需要涉及到回调,如果针对每种不同的callable object单独进行声明类型,代码将会非常散乱,也不灵活。如下示例: #include <iostream> #include <functional> using namespace std; // 传统C函数 int c_function(int a, int b) { return a + b; } // 函数对象 class Functor { public: int operator()(int a, int b) { return a + b; } }; int main(int argc, 继续阅读 >>


刘生玺 18/05/10 13:33:39
这个我是感觉在思路上没有那么复杂啦,参考书上的提示应该能够自己写出来,就直接上代码了 #include<iostream> #include<memory> #include<utility> #include<string> #include<algorithm> //Equivalent to " vector<string> " class StrVec{ public: StrVec():elements(nullptr),frist_free(nullptr),cap(nullptr){ } StrVec( const StrVec & ) ; StrVec( const std::initializer_list<std::string> & ) ; StrVec& operator=( const StrVec & ) ; 继续阅读 >>


刘生玺 18/04/19 19:17:33
首先解释一下什么是拷贝控制 ?其实就是拷贝构造函数、赋值操作符和析构函数这三种函数 . 那么如何编写这三个函数就叫做拷贝控制了. 1.整体需求 : 总共设计两个类: 1.一个是Message,代表电子邮件消息(或者其它) 2.一个是Folder ,代表消息目录 用生活中最一般的想法去思考,每一个消息目录中可以有许多消息(也可以有相同消息) , 每一条消息也可以出现在多个目录中 如下图所示 : 2 .程序架构设计 : 1. 记录Message在哪个Folder 中,记录Folder中有哪些Message ? 在 Message 中保存一个它所在的 Folder 的指针的set 集合 .(也就是说每一个Message中都有一个set集合) 同样的,在 Folder 中保存一个它包含的Message 的指针的set 集合 . 2. 删除一条 Message 时如何处理 ? 当我们删除一条 Message 时 ,我们需要考虑的是如何去删除其他目录中的 继续阅读 >>


刘生玺 18/04/18 21:23:13
提前声明 ,这是一篇水博!!! 1.使用智能指针实现: #include <string> #include <iostream> #include <memory> using namespace std ; class HasPtr { public: HasPtr(const std::string &s = std::string()) : ps(make_shared<string>(s)), i(0) { } HasPtr(const HasPtr& hp) : ps(hp.ps), i(hp.i) { cout << " 拷 贝 构 造 函 数 " << endl ; // 又多了一个对象使用 *ps } HasPtr& operator=(const HasPtr &rhs){ cout < 继续阅读 >>


刘生玺 18/04/08 19:25:47
1. 整体需求 使用标准库实现一个简单的文本查询系统。允许用户在一个给定的文件中查询单词。查询结果是单词在文件中出现的次数以及所在行的列表。如果一个单词在一行中出现多次,该行也只列出一次,但是出现的次数得统计在内。行序号按照升序输出。 2. 程序需要完成的功能和实现效果 需要完成的功能: 1.从文件按行读入信息,并将单词分离开来。 2.必须提取到每一个单词所出现的行号 3.行号按照升序排列且不重复 4.必须打印给定文本中的文字 5.必须统计出一个单词所出现的所有次数 实现效果: 3. 程序架构设计 <1> 因为要打印文本中所出现的文字,所以就意味着需要保存 ,那么我们选择vector<string> 来保存它,另外行号还可以作为它的下标来提取文字。 <2>使用istringstream 来分离单词 。 <3>对于每一个单词,我们使用一个multiset来保存它在文本中出现的行号 。这就自然保证了升序 继续阅读 >>


刘生玺 18/04/07 23:00:01
一:区块链是什么? 区块链(Blockchain)是由节点参与的分布式数据库系统,它的特点是不可更改,不可伪造!! 在比特币的世界里来说,就是一个记账本 。记录了其代币(token)的每一笔交易。通过这些信息,我们可以找到每一个地址,在历史上任何时刻所拥有的价值 。 区块链是由一串使用密码学方法产生的数据块组成的 ,每一个区块都保存了上一个区块的哈希值,从而连成一条链。也正因为如此,每一个区块都得确保按照时间顺序在上一个区块之后产生,否则前一个区块的哈希值就是未知的,对吧? 那么来举个例子吧 ! ! 比如,我邀请了几个产业界、金融界和财经界的权威人物组建了一个共享交流朋友圈,这个朋友圈的建立用的是区块链技术,也就是大家都有交流的终端应用,但数据不会像微信一样必须通过腾讯公司,而都是个人与个人之间的通讯硬件和软件上传输交流。这个朋友圈设立了一个规则,就是初始邀请的100位人士,各自拥有1个席位,未来每年只能增加5个席位。这个朋友圈用的是独特的加密技术,以至于其中的聊天文件不会被监 继续阅读 >>


刘生玺 18/03/22 22:02:12
题目描述: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note: Do not modify the linked list. Follow up: Can you solve it without using extra space? 题目分析:就是判断并找到一条单链表相交的起始节点,如果没有相交,返回 NULL 即可 。 解题思路:先来看下面的这幅图 给一个快指针,一个慢指针 。假设quick,slow指针在Z点相遇,则slow走了a+b;quick走了a+b+c+b; 因为quick速度是slow的2倍,有 则slow走了a+b;quick走了a+b+c+b; 由时间相同得到(设速度为v) : (a+b)/v = (a+b+c+b)/2v 2a+2b = a+b+c+b a 继续阅读 >>


刘生玺 18/03/15 19:19:19