C/C++语言
文章平均质量分 68
暂代
须知少日拿云志,曾许人间第一流。
展开
-
Modern C++的应用,实现golang中的defer
modern C++ 实现 golang 中的 defer 语法。实现的过程用到了:lambda表达式、std::move、std::forward、右值引用、宏连接等比较绕一点的语法,没有了解过的读者可以先去了解一下这些语法。原创 2019-11-17 00:54:08 · 522 阅读 · 0 评论 -
vector清空容器的操作以及个人的一些见解
当vector中存入大量的数据后,当我们不再使用vector中的元素后,如果能积极主动的去释放内存,那么是非常明智的。(对于小容量的数据,就没有这个必要了,因为对性能影响甚微)一、 知识背景:PS:这一部分是对文章题目所言操作的背景介绍,只关心题目的读者可以跳过为了支持随机访问,vector将元素连续存储到一块空间上(每个元素紧挨着前一个元素),那么当容器空间满了以后,再次插入新元素...原创 2019-04-17 22:46:44 · 981 阅读 · 0 评论 -
字符串切分的几种方式讲解
开发中,我们常常要用到 “ 字符串切分 ” 这种操作,比如:命令行的处理,消息格式的处理等。下面我讲解几种C/C++常用的字符串切分方式一、自定义如果项目这方面的需求比较简单,那么可以自己写一个字符串切分的函数#include <iostream>#include <string> // std::string#include <vector>...原创 2019-03-26 14:52:56 · 4756 阅读 · 0 评论 -
用c语言做一个词典
用C语言做一个词典原创 2017-12-06 16:45:59 · 13771 阅读 · 16 评论 -
STL线程安全讨论
最近在回头看STL里面的实现,也在进一步研究高性能服务器编程方面的东西,就想到那STL在多线程情况下是否安全呢?记录STL是数据结构和算法的精妙实现,因此为了追求极致的效率,内部并没有给所有的操作加锁。对于STL的容器而言,只有下面这两种情况可以保证线程安全:多个线程同时读取同一个容器的内容多个线程同时写不同的容器其他的情况,比方说:多个线程同时读、写同一个容器。这就不是线程安全...原创 2018-11-21 00:43:24 · 1736 阅读 · 0 评论 -
单链表的逆置算法解析
问题描述:比方说,一个不带头节点的单链表原来从头到尾存储的是(1, 2, 3, 4, 5),逆置后链表从头到尾存储的是(5,4,3,2,1)解决思路:我暂时想到的有三种解法: 1)从头到尾依次访问旧的链表节点,每访问一个,就将这个节点的数据用头插的方法插入到新的链表中,这样当旧的链表访问完毕时,新的链表就构造成功了,然后释放掉原来的链表空间,将头指针指向新的链表头节点。 2)和第一个...原创 2018-10-31 12:44:46 · 20437 阅读 · 5 评论 -
栈简易教程
栈(FILO)copyright@分时天月概论基本概念只能从线性表的一端进行插入和删除元素操作的数据结构即为栈。应用场景根据概念我们就可以得出,凡是只在数据结构一端进行插入删除的,并且不需要支持随机存取的场景就可以采用栈结构。下面列举一些栈的使用场景:C / C++ 函数调用是借助 栈帧 结构实现的,栈帧即栈结构(有兴趣的读者可以看看这个具体是怎么实现的)编译过程中的语法检查...原创 2018-10-26 11:28:32 · 357 阅读 · 0 评论 -
链表简易教程
链表copyright@分时天月请忽视我的画工~~一、概论1. 基本概念1.1 概念 逻辑结构上一个挨一个的数据元素,但是物理存储却没有占用一段连续空间的结构。示意图如下:由上图也可以看出,链表节点的构成:数据域 和 指针域。数据域存储链表需要存储的数据指针域存储后继节点在内存中的地址,即图中第一个节点指针域存储的 0xAB87AS,这个地址就是下一个节点的起始地址(...原创 2018-10-26 11:27:22 · 468 阅读 · 0 评论 -
队列简易教程
队列(FIFO)概论基本概念只在线性表的一端进行添加元素,在线性表的另一端进行删除元素的数据结构称为队列。这种规则称为 **FIFO(first input first output)**原则。 进入队列的一端称为“队尾”,出队列的一端称为“队头”。应用场景根据队列的存储特性,只需要使用数据结构实现一种顺序执行 / 访问的场景可以使用队列。计算机开发中使用队列这种逻辑结构也非常广泛,像...原创 2018-10-28 09:03:48 · 645 阅读 · 1 评论 -
顺序表简易教程
顺序表顺序表的各项操作我采用静态的方式讲解,因为我觉得如果需要支持动态扩容的线性结构,那么链表会是一个更好的选择,所以我通常使用顺序表结构只使用静态的就足够了。概述顺序表可以分为静态顺序表和动态顺序表两种,静态顺序表不可以扩容,一旦创建,它的容量就写死了,是多大就是多大,而动态顺序表则可以扩容。通常情况下,动态顺序表使用价值比较好一些,但是这也不一定,因为有时候我们确认了某些结构的空间不...原创 2018-10-19 17:26:19 · 547 阅读 · 0 评论 -
c语言实现顺序表(动态)
代码如下,代码的解析附于代码中:#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;assert.h&gt;#define Init_size 5//使顺序表更加灵活typedef int DataType;//使顺序表具有通用性typedef struct SeqListD{ DataType *_pDa...原创 2018-01-15 13:18:31 · 5199 阅读 · 0 评论 -
泛型编程实现结构Set
#include &lt;iostream&gt;//采用泛型编程的方式实现了一个支持交集,并集,差集,添加,删除方法的 set//规定这个集合不能包含相同元素//实现一个不包含重复数值域单链表//插入的时候按序插入//链表的节点template&lt;class T&gt;struct ListNode{ ListNode&lt;T&gt;* _next; T _ele...原创 2018-10-16 14:29:54 · 334 阅读 · 0 评论 -
C语言调用MySQL接口
说明:在做一个项目的过程中,用到了这部分知识,个人觉得网上关于这部分的介绍真的比较模糊,就自己总结一下项目中用到的这些接口的使用方法。准备工作这个项目是在Linux下开发,如果需要使用MySQL关于C语言的接口,首先得包含这个头文件&amp;amp;amp;lt;mysql.h&amp;amp;amp;gt;,而这个头文件在Linux系统中默认是没有的,所以首先得先安装: //安装MySQL sudo yum -y inst...原创 2018-09-15 21:51:45 · 1621 阅读 · 0 评论 -
C++可调用对象详解
文章目录一、函数二、函数指针三、重载了函数调用运算符的类四、Lambda表达式(C++11)1.参数2.捕获列表2.1值捕获2.2引用捕获2.3隐式捕获2.4混合捕获3.返回值类型4.深度理解4.1 Lambda是函数对象4.1 表示Lambda捕获行为的类5.应用场景对于一个对象或者表达式,如果可以对其使用调用运算符,即。如果a是一个可调用的表达式,则我们可以编写 a(args) ,其中 a...原创 2019-04-21 13:59:16 · 1406 阅读 · 1 评论 -
STL常用算法总结(持续更新)
STL中的谓词是什么? STL中的谓词是一个可调用的对象,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词(意味着它们有一个参数)和 二元谓词(意味着它们有两个参数)。接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词的参数类型。建议:本文中很多地方用到了Lambda表达式,如果不清楚的读者可以参考:C++可调用对象文章目录一、排序1....原创 2019-04-21 14:49:40 · 775 阅读 · 0 评论 -
聊一聊布隆过滤器(Bloom filter)
一个网站要添加URL黑名单,需要把包含20亿条URL的黑名单存储到计算机上,怎么存?怎么快速判断浏览器输入的url是否在黑名单中?原创 2019-09-16 16:56:17 · 505 阅读 · 0 评论 -
记一次对“缓冲区溢出漏洞”的攻击实验
记录一次对“缓冲区溢出漏洞”进行攻击的实验。通过这个实验,可以加深对函数调用底层原理(栈帧结构)以及缓冲区溢出危害的理解。进行这个实验之前,读者最好先了解一下函数的栈帧结构以及X86-64汇编语言基本语法。原创 2019-08-24 16:07:47 · 910 阅读 · 0 评论 -
C++ emplace_back和push_back性能比较
概述从理论上说,右值引用版的emplace_back要比左值引用版的push_back更快一些,因为前者会调用参数的移动构造函数,而后者会调用参数的拷贝构造函数。熟悉这两种构造函数的读者自然明白移动构造函数不需要重新分配内存空间,所以要比拷贝构造函数耗时更少。实践一直只是从理论上知道以上的观点,但是并没有实际验证,刚好一个最近回顾以前的一个项目的时候看到了push_back,所以打算写一段代...原创 2019-07-22 01:42:38 · 3131 阅读 · 0 评论 -
gflags简明使用指南
一、gflags简单介绍gflags是google开源的一套命令行参数解析工具。通常在项目开发中会有一种需求:可以在代码运行的时候指定某些代码中某些参数的值如果没有显式指定,这些参数可以使用默认的值比如:服务器编程中需要用到IP和端口号。但是这两个变量有时候在具体使用程序的时候才会有具体的值,如果不用gflags可以这么写://test.cc#include <iostrea...原创 2019-07-16 14:08:49 · 1251 阅读 · 0 评论 -
两个线程打印不同类型的字母
一、题目描述:两个线程分别打印26个英文字母的元音字母和辅音字母,分别按照字母序输出。二、解题思路:(1) 如果要求输出一行感觉看代码都可以看明白了…(2)如果要求输出两行由于线程之间共享全局变量,所以可以将26个字母保存到一个全局数组中,并且保存当前访问到数组元素的下标。然后再创建两个数组分别保存元音字母和辅音字母,不同的线程添加不同类型的字母到对应的字母表中,最后遍历打印元音字母表...原创 2019-06-28 23:59:48 · 349 阅读 · 0 评论 -
使用C++封装一个socket通信框架
封装一组socket常用通信操作,header only 风格。#pragma once#include <unistd.h>#include <string>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <f...原创 2019-06-22 23:56:14 · 795 阅读 · 0 评论 -
Boost库安装及使用记录
Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。文章目录一、前言Linux下安装Boost库二、Boost algorithm字符串切分字符大小写转换字符替换一、前言如果想要在项目中使用Boost库,首先要在开发环境安装Boost库。这里提供Linux Centos7.2开发环境下安装 Boost1.67 的方法。Linux下安装Boost库 1. 到官网下载需...原创 2019-05-12 11:15:02 · 481 阅读 · 0 评论 -
记C/C++获取文件大小的几种方法
以下操作需要包含头文件<fstream> | <string>size_t GetFileSize(const std::string& file_name){ std::ifstream in(file_name.c_str()); in.seekg(0, std::ios::end); size_t size = in.tellg(); in.cl...原创 2019-05-25 11:25:48 · 12207 阅读 · 0 评论 -
内存分配和对象构造分离使用
文章目录前言allocator 类前言new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合到了一起。这样会给我们在特定情况下带来一些不必要的浪费,同时带来性能上不必要的消耗。举个例子:std::string* const p = new std::string[n];std::string s;std::strin...原创 2019-05-14 15:25:26 · 535 阅读 · 2 评论 -
C语言实现二进制运算器
设计思路先将输入的两个二进制数转换成十进制,然后再进行相应的运算,最后将结果转换成二进制的形式打印。运行逻辑示意图函数调用示意图源码:#include <stdio.h>#include <string.h>#include <stdlib.h>#define BINARY_SIZE 32typedef enum{ false = 0,...原创 2019-04-26 23:02:44 · 6871 阅读 · 1 评论 -
C++STL中sort用法介绍
自定义STL中sort的排序规则前情提要:0、要使用sort,首先需要包含头文件&amp;lt; algorithm&amp;gt;1、sort函数可以指定两个参数,也可以指定三个参数。(1)第一个是要排序的数组的起始地址。(2)第二个是结束的地址(最后一位要排序元素的后一位的地址)(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是升序排序。2、...原创 2018-09-29 20:30:22 · 14735 阅读 · 0 评论 -
单链表实现多项式相加
这个小项目用C语言实现代码中有我的注释代码://mylist.h#pragma oncetypedef int DataType;typedef char Variate;typedef struct Node{ DataType _elem; //项的系数 Variate _ch; //规定'#'表示此项为常数项 int _power; //项的次方 s...原创 2018-10-13 20:04:19 · 12299 阅读 · 0 评论 -
C++学习_友元
C++学习_友元友元友元函数 1.概念:在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。 2.特性:友元函数可以访问当前类中的所有成员(private ,public,protected) 注:: 如果某个全局函数要访问指定类的私有成员,则要在指定类...原创 2018-04-13 16:45:18 · 321 阅读 · 0 评论 -
C++学习_类和对象
类和对象 一般类的头文件名称和类名相同(见名知意) C++的作用域有四种:全局,局部,命名空间,类域。 C++中类可以实现封装,所谓封装,就是隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合的一种机制。一。两对比较写在前面C++中class和struct的区别? 1> class中成员的默认访问属性为priva...原创 2018-04-13 16:45:45 · 325 阅读 · 0 评论 -
C++学习_this指针_构造和析构
一。this指针1> this指针作为成员函数参数传参this指针是编译器在调用类非静态成员函数的时候隐式传递给函数的(作为第一个参数),在传递this指针的时候有两种方式: 调用约定一般规定以下几个方面的内容: 1) 函数参数的传递方式,是通过栈传递还是通过寄存器传递 2) 函数参数的传递顺序,是从左到右入栈还是从右到左入栈。 3) 参数弹出方式。函数...原创 2018-04-13 16:44:41 · 460 阅读 · 0 评论 -
C++学习_运算符重载
运算符重载1.概念:赋予已经存在的,允许重载的运算符新的含义。2.不允许重载的运算符: ‘.’ 成员选择符 ‘::’域解析操作符 ‘?:’条件操作符 ‘.*’成员对象选择符3.注意:不能创建新的符号,只能重载C++中已经存在的,并且允许重载的运算符用于内置类型变量的操作符,其含义不可以改变,eg:‘+’就不可以改变其含义‘==’和‘!=’一般要成对重载前置自增 /...原创 2018-04-16 23:31:43 · 374 阅读 · 0 评论 -
C++学习_引用和命名空间
引用一。写在前面: 1. 引用的特性:引用在定义的时候必须初始化,并且只能“从一而终”。一个变量可以有多个引用(通常实体的声明周期比引用的声明周期长)2.编译器不会为引用分配内存空间,它和它引用的变量共同使用同一块内存空间二。常引用 注:这里指的是左值引用两种类型: - const 类型& 引用变量名 = 实体变量名; - const 类型&...原创 2018-04-13 16:46:51 · 454 阅读 · 0 评论 -
简易计算器_两种方法
一、一般的方法#include<stdio.h>#include<windows.h>#pragma waring (disable:4996)//屏蔽由于scanf引发的警告int add(int x,int y){ return x+y;}int sub(int x,int y){ return x-y;}int mul(int x...原创 2017-11-17 16:42:24 · 540 阅读 · 0 评论 -
C++学习_函数重载和默认参数
C++ 学习_函数重载和默认参数 我为什么要写C++系列博文呢?理由很蛋疼,因为C++的语法太庞杂了,从目前来看,后面我很难有精力和能力来总结一篇令我满意的”C++语法汇总”,所以干脆放弃那样做,将我学习的过程记录下来,这样写出来的东西包含的知识也比较全面。不过,由于我是学习的过程,所以在文章中难免有一些错误或者疏漏之处,希望大家不嫌麻烦的可以指出我的错误,本人会在第一时间修正该系列内容!...原创 2018-04-13 16:46:19 · 476 阅读 · 0 评论 -
C/C++_测试函数的运行时间
目前,存在着各种计时函数,它们的计时方式大都是下面这样的: 下面对这些计时函数做一个汇总,以供以后方便查阅: 方法1,time()包含在&lt; time.h &gt;中,用于获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个long int类型,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNI...原创 2018-04-09 17:28:11 · 3080 阅读 · 0 评论 -
c语言_通讯录(初级版)
这是一个简单的通讯录(实现方案是初级版,并且只能在程序运行期间存在(没有写入文件))(以后还会写一个用动态内存分配+实现文件存储的版本)代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<Windows.h>#pragma warning(dis...原创 2017-11-27 21:23:28 · 1498 阅读 · 0 评论 -
C语言知识深度汇总(本文仅谈语言,且不适合初学者阅读)
修正的部分内容的索引放在这里进行说明: 第一次修正:关于自定义类型那里进行了部分内容的修正 第二次修正: 1.对语句部分进行了大程度的修正 2.对数组部分进行了大程度的修正 3.补上了位段的一系列操作 4.对文章中的一些地方进行了小幅度修改(使之更严谨,更容易阅读理解) 第三次修正: 1.增加了文件操作部分的内容 2.对文章中的一些地方进...原创 2018-02-21 09:34:00 · 5530 阅读 · 14 评论 -
动态内存管理_C
一、函数介绍 以下四个函数都包含在头文件< stdlib.h >1.malloc 函数原型:void *malloc(size_t size); 作用:从堆空间申请内存 函数参数:需要申请的空间大小(字节数) 返回值:申请成功则返回一个指向申请到的内存的指针,失败则返回NULL2.calloc 函数原型:void *calloc(size_t num,siz...原创 2018-04-30 09:17:35 · 377 阅读 · 0 评论 -
浅拷贝以及其诸多解决方案
什么是浅拷贝呢? 我觉得根据代码来讲解这个问题,更容易理解浅拷贝的概念。 (以下第一段代码包含头文件,其他的均不包含,因为,这不是重点)代码:#include&lt;iostream&gt;#include&lt;string.h&gt;using namespace std;class String{public: String(const char* s = ...原创 2018-04-30 18:37:37 · 951 阅读 · 1 评论 -
C语言实现链表
用C语言实现数据结构和算法莫过于最爽的事。 —摘自CoolShellPS:这里我用C语言实现的链表是不带头节点的单链表,这个是链表里面实际操作中最容易出错的一种链表,我在代码中会指出需要注意的内容说明-&amp;amp;gt;SListHead.h 尾插:从单链表的尾部插入一个新的节点 尾删:从单链表的尾部删除一个节点 头插和头删就不用说明了吧。。。#include&amp;amp;lt;stdio...原创 2018-02-21 09:35:34 · 457 阅读 · 0 评论