![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 70
肥宝Fable
微信公众号:肥宝的实验室
超级实验室,技术黑工厂
展开
-
ACE前摄器Proactor
你把邮件和包裹及交给总台,总台MM说,好了,你帮你发,你忙去吧!邮局的人也来了,取走了邮件,放心好了”。某个时间,MM打电话来了:“帅哥,你的包裹到了,我帮你签收了,快来拿吧。我们的CPU一般为P4 3.0GHZ,如果是32位的处理器,一秒钟大概可以处理6G的字节,那么,128KB的网络速度是远远及不上处理器的速度的。操作系统提供了异步的模式来传输网络数据,工作模式即:应用程序把要发送的数据交给操作系统,操作系统把数据放在系统缓冲区后就告诉应用程序OK了,我帮你发,应用程序该干嘛干嘛去。原创 2023-11-23 20:58:35 · 125 阅读 · 0 评论 -
Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)
第一步下载的openssl解压一下,放到E盘,这里我第一次操作的时候,是进入E盘,就输入命令行的。所以搞了第二次的时候,我直接创建了一个叫xxx的文件夹,把解压的内容放到xxx里面。由于我要生成的是32版本的openssl,所以下载了32版本,不过我觉得应该不影响的。令我费解的是既然这个是不是也不影响生成的版本的呢,因为下面的命令行是要填生成的是64还是32的。1.首先确认一下自己的代码是Win32的还是Win64的,我操作系统是64的,忘记程序不知道什么时候改为32的了,后来又重新搞了一遍。原创 2023-04-26 17:44:15 · 5324 阅读 · 0 评论 -
Python3调用C++:一些简单的参数和返回的例子
#include <Python.h> #include <iostream>#include <vector>using namespace std;typedef vector<double> SeqDouble;typedef vector<SeqDouble> SeqSeqDouble;//普通参数的输入void test1(int a, char* b, double c){ std::cout << .原创 2020-12-28 22:17:59 · 886 阅读 · 0 评论 -
Python3调用C++:HellowWorld
百度搜过,没多少说这个的,来来去去就一连篇文章,而且是python2的。搜到一个python3,复制下来,还得研究半天。所以自己记录一下,免得忘记,毕竟不是专业写python的。python:3.8C++:Visual Studio 2019的C++基本逻辑就是把C++部分的代码编译成dll。然后python当做一个库直接导入。一开始觉得不方便。不能像Python那样直接执行。但其实再想想,运行C++程序,本来就要编译的,就没觉得什么了。C++部分的代码:#inclu.原创 2020-12-28 12:10:21 · 325 阅读 · 0 评论 -
《C++ Primer Plus(第六版)》(46)(STL函数汇总)
非修改性序列操作 all_of() 如果所有元素的谓词测试都为true,则返回true,C++11any_of() 只要有一个谓词测试为true,返回true,C++11none_of() 如果所有测试都为false,则返回false,C++11for_each() 对序列中的每个元素执行某操作。find() 在序列中找出某个值的第一次出现的位置。f原创 2017-01-05 23:51:03 · 2488 阅读 · 0 评论 -
数据结构:栈Stack的实现与代码分析
栈的主要特点是LIFO,后进先出。只能访问栈顶。可以使用数组或者链表来实现。所以写了两个版本的实现。其实,从代码的角度看,直接使用List是最简单的,但是从效率的角度看,使用vector更加高效一点。对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现先看看代码://// Stack.h// HelloWorld/原创 2017-01-08 23:39:47 · 2469 阅读 · 0 评论 -
数据结构:队列Queue的实现与代码分析
队列Queue是先进进出FIFO和后进后出LILO的。只能从队尾放入数据,从对头删除数据。跟Stack一样,我也写了两个版本,但是跟Stack还是有所不同的。用List实现的队列,是没有大小限制的,用Vector实现的队列,是有大小限制的,其实更加复制,很多地方要注意的。对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现同原创 2017-01-09 11:50:27 · 2484 阅读 · 0 评论 -
数据结构:树tree和二叉树BinaryTree的实现与代码分析
一些概念:一棵树是一些结点的集合。这个集合可以是空集,若不是空集,则树由称作根(root)的结点r以及零个或多个非空的(子)树T1,T2...Ta组成,子树中每一个棵的根都被来自根r的一条有向的边(edge)所连接。每一棵子树的根叫做根r的儿子(child),而r是每一棵子树的根的父亲(parent)。没有儿子的结点成为叶(leaf)结点。具有相同父亲的结点为兄弟(siblings原创 2017-01-09 19:16:13 · 2830 阅读 · 0 评论 -
数据结构:平衡二叉树(AVL树)
AVL树是每个结点的左子树和右子树的高度最多差1的二叉查找树。要维持这个树,必须在插入和删除的时候都检测是否出现破坏树结构的情况。然后立刻进行调整。看了好久,网上各种各种的AVL树,千奇百怪。关键是要理解插入的时候旋转的概念。//// AvlTree.h// HelloWorld// csdn blog:http://blog.csdn.net/u012175089/原创 2017-01-10 00:27:25 · 2637 阅读 · 0 评论 -
数据结构:伸展树,M叉树,B树
伸展树(splay tree):也叫分裂树,当一个结点被访问后,它就要经过一系列AVL树的旋转被推到根上。M叉树:可以有M路分支,高度大约是logmNB树:经过M叉树的多次变种和改进。有如下特性:1.数据项存储在树叶上2.非叶结点存储知道M-1个键,以指示搜索的方向;键i代表子树i+1中的最小键。3树的根或者是一片树叶,或者其儿子数在2和M之间。4除根外,所原创 2017-01-10 10:36:44 · 2676 阅读 · 0 评论 -
数据结构:散列1(分离链接法)
散列:将每个键映射到从0到TableSize-1这个范围的某个数,并将其放到适当的单元中。这个映射成为散列函数理想情况下,不同的键映射到不同的单元,但是现实中是不可能的,所以好的散列函数,应该尽量均匀地分配键。列表的大小最好是素数,这个非常非常重要。解决冲突:冲突:如果一个元素插入时与一个已经插入的元素散列到相同的值,那么就产生了一个冲突。解决冲突的方法:分离链接法原创 2017-01-10 17:33:56 · 2505 阅读 · 0 评论 -
数据结构:散列2(探测法)
上一章的内容:散列1:分离链接法对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现散列表的填装因子(load factor)λ为散列表中的元素个数和散列表大小的比值。探测散列表:在找到位置后,发现已经有数据,继续找下一个,直到找到位置。这种表叫做探测散列表。再散列:当散列表中数据很多的时候,插入可能会失败,这个时候原创 2017-01-10 17:53:35 · 2433 阅读 · 0 评论 -
《C++ Primer Plus(第六版)》(34)(第十六章 string类和标准模板库 笔记)
stirng,STL,智能指针,数据结构,算法1.string的构造函数string(string&& str)不保证将str视为const,这种构造函数被称为移动构造函数。在有些情况下,编译器可能使用它而不是复制构造函数,以优化性能。2.string的构造函数string(initializer_list il)能够将列表初始化语法用于string类string s = { 'a', 'b', 'c' }原创 2016-12-31 13:33:12 · 2820 阅读 · 0 评论 -
数据结构:链表List的实现与代码分析
跟Vector一样,我自己也写了一个简单的List来进行研究。这里实现的是双向链表,因为双向链表包含了单向链表的所以功能,所以就没有单独写一个了。这个双向链表的实现,在创建的时候,就已经有了两个节点,分别是head和tail。这是抽离出来,不存放数据的节点,是为了让程序简化,被称为哨兵节点。假如不使用哨兵节点,在表头表尾操作的插入删除的时候,有很多要特殊处理的地方。加了着两个节点,原创 2017-01-08 19:16:43 · 3266 阅读 · 2 评论 -
《C++ Primer Plus(第六版)》(47)(总结)
总结:我是总结完下面的列表,才再回来写总结的,现在看来,这本书的排版还是不错的,由浅入深,很有规律。其实,一开始我是想看《C++ primer》的,看的是电子版,同学发给我的。结果看了几章后发现是山寨的。不过最后还是看完了。我没有看过多少其他的C++的书。不知道这本书好不好。但是作为一个多年C++经验的程序员,重新打一下基础,真的很不错。或者,把所有题目都做完,就差不多了吧。注:末尾带有※※※的,都是很多列表清单或者比较重要但是不那么记得的东西,也就是说,挺重要的。基础的数据第二章 开始学原创 2017-01-06 11:25:22 · 2953 阅读 · 0 评论 -
7年码农的一些人生感悟
本来是写在《C++ primer plus》总结里面的,但是想想又觉得那个是知识性总结,于是把这些内容抽出来了。感悟:一开始的时候,只是想补充一下基础,因为确实没有系统地学过C++的东西,很多细节都不清楚。但是随着学习,发现很多地方,跟其他语言都是想通的,就连之前一直觉得其他语言有的,C++却没有的地方,也都逐渐发现和对照起来了。看完这个,或者还有很多细节不知道,但是就像在原创 2017-01-06 11:29:11 · 3118 阅读 · 1 评论 -
《C++ Primer Plus(第六版)》(30)(第十四章 C++中的代码重用 编程题答案)
14.7 编程练习1.Wine类有一个string类对象成员(参见第4章)和一个Pair对象(参见本章):其中前者用来存储葡萄酒的名称,而后者有2个valarry对象(参见本章),这两个valarry对象分别保存了葡萄酒的酿造年份和该年生产的瓶数。例如,Pair的第1个valarray对象可能为1988、1992和1996,第二个valarry 对象可能为24、48和144瓶。Wine最好有1原创 2016-12-29 11:24:18 · 4615 阅读 · 5 评论 -
《C++ Primer Plus(第六版)》(31)(第十五章 友元、异常和其他 笔记)
友元类,友元类函数,嵌套类,异常,运行时类型识别,type_id,type_info,各种转换1.友元类,就在类中声明个friend class className;就行了。这个是对所有成员有效的。 class A { public: A(int a){ _a = a; } friend class B; private: int _a; }; class B { public: int get(A a){ return a.原创 2016-12-29 21:13:35 · 2531 阅读 · 0 评论 -
《C++ Primer Plus(第六版)》(32)(第十五章 友元、异常和其他 复习题答案)
15.7 复习题1.下面建立友元的尝试有什么错误?a.class snap{ friend clasp; ...};class clasp{ ... };b.class cuff{public: void snip(muff&){..} ...};class muff{ friend void cuff::snip原创 2016-12-29 22:50:50 · 2766 阅读 · 0 评论 -
《C++ Primer Plus(第六版)》(33)(第十五章 友元、异常和其他 编程题答案)
总结: 貌似越到后面,就经常出现了排版混乱的情况,不知道是原版的问题还是翻译本的问题。程序例子也越来越抽象了,而且是说明的东西居多。其实初学者,甚至学得好深入的人,接触的可能还是很少。很多细节,只有在非常底层或者特定的应用中才会使用到。或者,用到的时候,百度一下就可以了。15.8 编程练习1.对Tv和Remote类做如下修改:a.让他们互为友元;b.在Remote类中添加一个状态变量成员,该成员描述遥控器是川渝常规模式还是互动模式;c.在Remote中添加一个显示模式的方法;d.在Tv原创 2016-12-30 11:36:56 · 2824 阅读 · 0 评论 -
数据结构:向量Vector的实现与代码分析
Vector是比较常用的结构,在C++的STL中就有了vector的实现,在头文件中可以看到。但是STL的实现就像一个超级大的蛋糕,我们不可能一口一口地吃下去。最好的办法是从基础的思想开始,自己跟着写一个简单版本的Vector。vector究竟是什么?其实本质上就是数组,只是经过封装后,可以忽略数组的长度限制。除了这一点,其他的特性跟数组都差不多。对于队首和队中插入和删除都要耗费O原创 2017-01-07 21:02:49 · 5427 阅读 · 0 评论 -
关于模板类中,子类无法访问父类成员问题的解决方法
问题:今天研究数据结构,按着书敲代码,发现子类中直接调用父类成员居然无法通过编译。看了好久都没发现问题,尝试将父类private属性改为public,发现也是不行。解决办法:然后我想着用域作用符,居然可以。在网上搜了一下,发现用this指针,也是可以解决这个问题的。//// List.h// HelloWorld// csdn blog:http://blog.原创 2017-01-08 08:53:02 · 5056 阅读 · 0 评论 -
数据结构:优先队列--堆
堆是一棵被完全填满的二叉树。底层可以例外。也成为完全二叉树。因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链。对于任一个位置i上的元素,左儿子在2i上,右儿子在2i+1上。其父亲在i/2上。堆的某个结点,必须必它的子孙结点都小,所以堆是完全二叉树,但是完全二叉树不一定是堆。//// Heap.h// HelloWorld// csdn blog:http:/原创 2017-01-10 22:35:03 · 2489 阅读 · 0 评论 -
算法分析:插入排序
插入排序是最简单的排序算法之一。插入排序由N-1趟(pass)排序组成。对于p = 1到N - 1趟,插入排序保证位置0到位置P上的元素为已排序状态。//插入排序 template void insertionSort(Vector& a) { int j; for (int p = 1; p < a.size(); ++p) { Comparable temp =原创 2017-01-11 10:30:11 · 2406 阅读 · 0 评论 -
算法分析:谢尔排序(缩减增量排序)
谢尔排序也叫缩减增量排序。谢尔排序使用一个序列h1,h2,···,ht,叫做增量序列。有些增量序列对排序效率起到更好的效果。template void shellSort(Vector& a) { for (int gap = a.size() / 2; gap > 0; gap /= 2) { for (int i = gap; i < a.size(); ++i)原创 2017-01-11 11:15:26 · 2517 阅读 · 0 评论 -
C++ for循环中vector和map的erase
直接用erase后返回的iter赋值过去就好了,没删就自增。好记性不如烂笔头,还是得记下来。o(∩_∩)o 哈哈 std::vector<int> a = {1,2,3,4,5,6,7,8}; for (std::vector<int>::iterator iter = a.begin(); iter != a.end(); ) { if (*iter ...原创 2018-08-16 22:16:32 · 3119 阅读 · 0 评论 -
Visual Studio配置(6):项目属性页-C/C++(2)
代码生成:启用字符串池:允许编译器在执行过程中,在程序影像和内存中创建相同字符串的单个只读副本,从而生成较小的程序。启用最小重新生成:在首次编译期间,编译器在项目的.idb文件中存储源文件和类定义之间的依赖关系信息。 (依赖关系信息表明每个源文件所依赖的类定义以及该定义位于哪个.h 文件中。)后面的编译使用存储在.idb 文件中的信息确定是否需要编译某个源文件(即使它包含已原创 2017-02-15 10:56:47 · 4489 阅读 · 0 评论 -
Visual Studio配置(5):项目属性页-C/C++(1)
C/C++:仅对当前项目有效常规:附加包含目录:搜索包含文件的目录其他#using指令:指定一些#using指令调试信息格式:无 不产生任何调试信息,因此编译较快程序数据库(/Zi):产生并包含用于调试器的类型信息和符号调试信息的程序数据库(PDB)。不影响优化,暗示了debug。信息放在pdb文件而不是obj文件。C7兼容(/Z7):生成包含用于调试器的完整符原创 2017-02-14 18:05:44 · 5399 阅读 · 0 评论 -
Visual Studio配置(4):项目属性页-VC++目录
VC++目录:对所有项目都有效--可执行文件目录:搜索可执行文件的目录。对应于PATH环境变量。--包含目录:搜索源代码中引用的包含文件的目录。对应于INCLUDE环境变量。--引用目录:搜索通过#using指令在源代码中引用的程序集和模块文件的目录。对应于LIBPATH环境变量--库目录:搜索库(包括运行时库)的目录。对应于LIB环境变量--Windows运行库目录:--原创 2017-02-14 16:17:47 · 4406 阅读 · 0 评论 -
Visual Studio配置(3):项目属性页-调试
调试:所有属性都是给调试的时候使用的,如果不是调试中,是不会起作用的。--要启动的调试器:貌似可以选择远程的调试器--命令:表示调试器要启动的exe文件的全名。默认值为$(TargetPath),点击那个绿色三角形就是调用这个命令的。--命令参数:启动程序的时候,传递给程序的参数,最终会传递近main函数的参数列表,至于什么格式,就看程序怎么写的了。--工作目录:默认是工程原创 2017-02-14 16:15:15 · 4953 阅读 · 1 评论 -
Visual Studio配置(2):项目属性页-常规
通用属性:--引用:好像了解一点,但又说不出来是干嘛的。常规:对一些变量进行赋值,编译的时候回用到。这些变量,好多都是顾名思义的。--输出目录:$(OutDir)这个路径只是起到定义OutDir这个变量的作用--中间目录:$(IntDir)中间目录--目标文件名:通常就是工程名$(ProjectName)--目标文件扩展名:后缀名,一般就是.exe、.dll之类原创 2017-02-14 16:10:09 · 6831 阅读 · 0 评论 -
Visual Studio配置(1):解决方案属性说明
写完后发现很多是顾名思义的,但是道理我都懂,但为什么这样呢?网络上也找不到,可能很少人用到吧。不过其实也是,很多东西知道一点就知道解决问题的方向了。debug版本和release版本:Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使原创 2017-02-14 16:06:43 · 3703 阅读 · 0 评论 -
Visual Studio项目目录和文件说明
Visual Studio项目属性配置VS6.0以及之前的版本是非常旧了,跟VS2002以及之后的版本有非常大的差别。VS2002之后,虽然每个版本都有变化。但是思想上已经非常成熟了。vc5,6的工程文件是.dspvc2002-2008工程文件是vcprojvc2010之后是vcxprojvcproj和vcxproj都是xml格式的。我这里是使用VS2013的,原创 2017-02-13 18:26:05 · 13773 阅读 · 2 评论 -
dll和lib的区别
两种库:动态链接库(dynamic link library),代码由运行时加载在程序空间中的DLL提供。静态链接库(static link library),在编译的时候直接将代码加入程序当中。两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或者.exe文件),仅包含在运行时定位DLL函数的可执行代码所需要的信息。静态链接使用静态链接库,链接器从静态原创 2017-02-13 16:49:27 · 2221 阅读 · 0 评论 -
C++标准库和模板库
C++标准库的内容总共在50个标准头文件中定义。在C++开发中,要尽可能地利用标准库完成。这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间、人力重新开发呢;(2)质量:标准库的都是经过严格测试的,正确性有保证;(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平;(4)良好的编程风格:采用行业中普遍的做法进行开发。原创 2017-01-12 17:15:41 · 2650 阅读 · 0 评论 -
算法分析:冒泡排序
应该是最简单的排序了,看代码就行了//冒泡排序 template void bubbleSort(Vector& a) { int i, j, temp; for (j = 0; j < a.size() - 1; j++) { //每一次循环,都会产生一个最大数在末尾,所以下面的不用比较了 for (i = 0; i < a.size() - 1 - j; i+原创 2017-01-12 11:20:14 · 2329 阅读 · 0 评论 -
算法分析:间接排序
排序的过程中,经常要交互数据,尤其是对于C++这种语言,交互两个比较大的对象,是很耗时间的。如果只是交互两个对象的指针,就会快很多了。间接排序的关键是排序后,怎样才能按指针的顺序,摆好数组的位置。其中核心的排序算法,是使用了快速排序 //------------间接排序--------- template class Pointer//构建一个可以比较的指针 { publi原创 2017-01-12 11:09:31 · 3902 阅读 · 0 评论 -
赫墨拉游戏-服务端-编程规范
为了方便大家交流和代码共享,现在此做出一个共同的代码风格约定。本规范适用于项目C++语言以及其他语言与C++的交集部分。PS:本规范只对预计可能导致代码风格有较大不同的部分作出约定。一、命名规范对于所有类型的命名都有效的规范:命名是非常重要的,l 名称表述清楚,使用统一的英文词汇。l 不使用英文简写,除非是一些固有的缩略语。l 单词命名优先表达清楚意思,其次才考虑原创 2017-02-07 19:38:22 · 3362 阅读 · 0 评论 -
算法分析:快速选择
使用类似快速排序的方法,找出第k小的元素。k从0开始的。使用了快速排序的部分函数 快速排序 //快速选择 template Comparable& quickSelect(vector& a, int left, int right, int k) { if (left + 10 <= right)//这个子数组大于10,继续使用快速排序原创 2017-01-11 22:26:40 · 2542 阅读 · 0 评论 -
算法分析:快速排序
快速排序(quicksort)是在实践中最快的已知排序算法。平均运行时间是O(NlogN),最坏的情形是O(N^2)算法之所以特别快,主要是由于非常精炼和高度优化的内部循环。1.如果S中元素个数是0或1,则返回2.取S中任一元素v,成为枢纽元(pivot)3.将S-{v}(S中其余元素)划分成两个不想交的集合:左边<v,右边≥v。4.返回左边的排序,后跟v,继而右边的排序原创 2017-01-11 21:56:51 · 2726 阅读 · 0 评论