自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 C++封装MutexLock,MutexLockGuard,Condition 实现多线程问题:两个消费者轮流消费

C++封装MutexLock,MutexLockGuard,Condition 题目要求:设置两个消费者型线程,进行交替消费,不考虑存货 为什么要使用MutexLockGuard? 在生成MutexLockGuard类对象之后,自动加锁,然后在语句块中执行完毕,调用析构函数的时候自动解锁,这样自...

2020-02-28 15:09:34

阅读数 0

评论数 0

原创 C++流操作练习:统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频 并组成字典

C++流操作练习:统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频 并组成字典 一.题目 统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频, 输入:某篇文章的绝对路径 输出:词典(词典中的内容为每一行都是一个“单词 词频”) 词典的存储格式如下...

2020-02-27 16:35:42

阅读数 16

评论数 0

原创 类只能生成栈对象(或只能生成堆对象)

类只能生成栈对象(或只能生成堆对象) 一.类只能生成栈对象 将运算符new/delete进行重载,并放到private区域中,这样就不能通过new创建类的堆对象了。 #include<iostream> #include <pthread.h> #include<un...

2020-02-26 13:10:34

阅读数 6

评论数 0

原创 单例模式封装pthread.h互斥锁与条件变量,实现生产者消费者小程序 C++

单例模式封装pthread.h互斥锁与条件变量,实现生产者消费者小程序 C++ 一.前言 我们知道,在pthread.h的头文件中,有互斥锁mutex与条件变量cond可以用来实现对公共资源的互斥访问。当在C++程序中,需要封装成类,同时我们又明白互斥锁与条件变量只能申请一个,所以这里就需要用单...

2020-02-26 09:05:29

阅读数 14

评论数 0

原创 多线程 互斥锁与条件变量实现车站卖票程序

int pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) int pthread_mutex_lock(pthread_mutex_t *__mutex) int pthread...

2020-02-25 11:24:32

阅读数 9

评论数 0

原创 多线程 pthread_create pthread_exit pthread_join

多线程 int pthread_join(pthread_t __th, void **__thread_return) int pthread_create(pthread_t *restrict __newthread, const pthread_attr_t *restrict __at...

2020-02-24 15:35:09

阅读数 11

评论数 0

原创 signal与raise

signal函数 signal函数: void (*signal)(int SIGINT, void (*signalHander)(int) ) SIGINT表示的时接受到的信号的序号,如ctrl+c的信号是2; signalHander则是进行信号处理的函数,传入的参数int则是接受到的信...

2020-02-23 13:17:34

阅读数 10

评论数 0

原创 单例模式(C++描述)

单例模式 单例模式总结: 1.只能通过调用类中的函数来创建对象,其他方法均不行。 2.实例化的对象必须是唯一的,如果还有用户申请返回对象,返回的对象其实是同一个实例化的对象。 关于单例模式的问题: 1.构造函数与析构函数为什么要放在private区域中? 这样就只能通过getInstance和d...

2020-02-22 16:19:21

阅读数 7

评论数 0

原创 简单理解补码

简单理解补码 一.引言 原码反码补码: 其中最不容易理解的就是补码,先来看一个关于时钟的例子: 10点到8点,中间差了几个小时? 算法一:10-8 = 2小时 算法二:10+(24-8)mod 24 = 2小时 从算法二可以看出,减去一个数,相当于加上了另一个正数(只是需要取模)。 二.正文...

2020-02-21 14:49:52

阅读数 17

评论数 0

原创 有符号数与无符号数

有符号数与无符号数 一.有符号数 有符号数中: 如果一个有符号数有n+1位,除去最高位用来表示符号,那么剩下n位数可以表示数值;共可以表示2n位数,正数为0~2n-1, 负数为-1~-2n。 其中需要注意的是100000000 000000000 这个数,表示最大的负数,因为之前0已经用正数中的...

2020-02-21 14:42:40

阅读数 15

评论数 0

原创 指针常量与常量指针,指针函数与函数指针,指针数组与数组指针

指针常量与常量指针,指针函数与函数指针,指针数组与数组指针 一.指针常量与常量指针: 常量指针:本质是指针,所以可以改变指向,那么指向的地址值可以改变,但是地址中存放的值不能改变 指针常量:如int* const a = &i; 本质是常量,如int i=3;一样,地址中存放的元素值可以...

2020-02-21 09:42:13

阅读数 10

评论数 0

原创 Linux环境下makefile文件的使用

Linux环境下makefile文件的使用 前言 先来看源程序: main.cpp: #include "Head.h" #include <iostream> using namespace std; int main(){ cout <<...

2020-02-20 10:58:50

阅读数 12

评论数 0

原创 Linux环境下源文件到可执行文件:预编译->编译->汇编->链接

Linux环境下源文件到可执行文件:预编译->编译->汇编->链接 前言 在使用编译器对C/C++源文件进行编译的过程分为了: 预编译 编译 汇编 链接 一.预编译 预编译的任务是将像#define , #include这样的宏定义于头文件进行解释。#include &qu...

2020-02-19 14:18:27

阅读数 12

评论数 0

原创 硬链接与软链接

硬链接与软链接 使用linux中的文件系统来演示软链接与硬链接。 硬链接 linux的文件系统存放着很多节点,在我们创建了file文件(指向节点是1062772),再将file1文件硬链接到file文件时,实质上是将file1文件也指向了1062772节点,当只有指向1062772节点的文件全...

2020-02-15 15:51:24

阅读数 13

评论数 0

原创 VMWare中的NAT与桥接模式

VMWare中的NAT与桥接模式 要想理解NAT模式与桥接模式,需要先了解一下IP地址有关的基础知识: 一.内网IP与外网IP,NAT 1. 外网IP(公有地址IP) IPv4地址一共有32位,那么一共有的IP地址也就是232 = 4G 约等于 40亿个,全球人数70亿多,如果每一个人都分配一个...

2020-02-13 16:18:20

阅读数 153

评论数 0

原创 模板

模板 template模板: C++模板编程分为 函数模板编程 与 类模板编程 0.函数模板 template<typename T> T max(const T& lhs, const T& rhs){ if (lhs > rhs) return l...

2020-02-12 22:48:18

阅读数 19

评论数 0

原创 new/malloc 的区别

new/malloc 的区别 总结: 0.区别最大的一点: new可以申请对象动态内存,并且调用对象的构造函数,析构函数等,而malloc只是简单地申请堆内存。 1.参数: new由编译器计算出分配内存的大小,malloc需要显示写出分配空间字节大小; delete a, delete[] a对...

2020-02-12 16:06:38

阅读数 33

评论数 0

原创 动态内存分配:一维、二维、三维动态数组

动态内存分配:一维、二维、三维动态数组 1.一维动态数组 1,2,3,4,5 void cpp_test1() { int *a = new int[5]; for (int i = 0; i < 5; i++) a[i] = i + 1; //print for (int...

2020-02-12 14:51:44

阅读数 18

评论数 0

原创 try/catch/throw

try/catch/throw try/catch/throw的优点: 1.可以自定义抛出异常之后的操作 2.异常抛出后会一直返回调用函数(或者说上一层函数),直到被catch到,所以便可以统一将catch语句写在一起,使代码更加方便整洁。 1.遇到除0时的异常 void test1() ...

2020-02-12 13:39:29

阅读数 49

评论数 0

原创 LeetCode347.前k个高频元素

LeetCode347.前k个高频元素 解法一:哈希表排序 方法一:hash表直接排序 unordered_map<int, int> 第一个int表示数字,第二个int表示频率 1.nums全部插入hashmap中,如果插入失败,则说明key已经存在,则val++ O(n) 2.h...

2020-02-11 15:54:31

阅读数 15

评论数 0

原创 找出无序数组中第K大的元素(前K大元素)

找出无序数组中第K大的元素(前K大元素) 方法一:堆排序 堆排序法: 原理:首先建立k个元素的小顶堆,然后遍历数组并且不断调整小顶堆,遍历之后小顶堆堆顶就是第k大元素,整个小顶堆存放的也就是前K大的元素。 时间复杂度:O(klogk + (n-k)logk) = O(nlogk) 空间复杂度:O...

2020-02-11 11:22:48

阅读数 22

评论数 0

原创 STL vector

STL vector 辅助函数:print 函数 template <typename T> void print(vector<T>& vec) { for (int i = 0; i < vec.size(); i++) cout <&l...

2020-02-03 16:00:25

阅读数 18

评论数 0

原创 STL map和unordered_map

STL map 此处引用官方文档: http://www.cplusplus.com/reference/map/map/ 1.MemberFunction constructor void test1() { map<char, int> first; first[...

2020-02-03 09:23:38

阅读数 15

评论数 0

原创 文件流、指针偏移、流状态位

文件流、指针偏移、流状态位与圣经文件练习 一.文件流 在文件流中, 定义的类型有: fstream 既可以是输入流也可以是输出流 ifstream 输入流 ofstream 输出流 在对文件进行操作前,需要以open的形式打开,第一个参数是filename, 第二个参数是...

2020-01-17 12:03:30

阅读数 40

评论数 0

原创 cin输入流的操作

cin输入流的操作 一.cin流 test1 void test1() { char str1[20], str2[20]; cin >> str1 >> str2; cout << "str1:" << str1 &...

2020-01-16 13:00:40

阅读数 21

评论数 0

原创 智能指针

智能指针 此篇文章参考于: https://www.cnblogs.com/wuyepeng/p/9741241.html 智能指针的作用:用来自动释放空间,可以避免内存泄漏与野指针的情况。 目前有常用的三种智能指针: shared_ptr unique_ptr weak_ptr auto_pt...

2020-01-15 14:55:10

阅读数 15

评论数 0

原创 内存泄漏与野指针

内存泄漏与野指针 1.内存泄漏 #include<iostream> using namespace std; //内存泄漏情况 void test1() { int *a = new int(); cout << a << "空间并没有被释放&...

2020-01-15 12:44:19

阅读数 17

评论数 0

原创 运算符重载 基础运算符

运算符重载 整个测试用例的类为:(全部代码放在最后) class Line{ public: Line(int length) :_length(length) { } void display() { cout << "Length = " <&...

2020-01-15 09:10:19

阅读数 27

评论数 0

原创 在函数中自动调用复制构造函数

在函数中自动调用复制构造函数 #include <iostream> #include <stdio.h> #include <string> using namespace std; class A { public: A(string name):_na...

2020-01-14 17:23:32

阅读数 37

评论数 0

原创 const用法详解,&(引用)的本质

const 用法详解与引用 一.const修饰常量、指针 #include <iostream> #include <stdio.h> using namespace std; //1.const修饰常量 void test1() { const int i = 10;...

2020-01-14 15:48:52

阅读数 16

评论数 0

原创 虚函数详解

虚函数 一.虚函数的作用 我们先看没有虚函数的情况: #include <iostream> using namespace std; class A { public: void func() { cout << "A::func()" <...

2020-01-13 23:15:53

阅读数 10

评论数 0

原创 虚基表与虚继承

虚基表与虚函数表 一.虚基表 首先利用菱形继承的案例(如下),说明如果派生类D中会出现两个_a,一个是B::_a, 还有一个是 C::_a, 这样便会有二义性,导致编译器报错。 #include <iostream> using namespace std; //菱形继承案例 cl...

2020-01-13 09:28:32

阅读数 25

评论数 0

原创 拷贝构造函数,深拷贝与浅拷贝

拷贝构造函数,深拷贝与浅拷贝 一.拷贝构造函数 先直接来看代码: #include <iostream> #include "help.h" using namespace std; class Line { public: Line(const char *m...

2020-01-10 16:44:03

阅读数 12

评论数 0

原创 友元

友元 一.友元函数 如果类A将函数func作为友元函数,那么: func可以访问类A中protected, private 修饰的成员; func并不属于类A,而是作为一个函数单独存在,即func可以作为很多类的友元函数。 #include <iostream> #include...

2020-01-10 11:34:00

阅读数 12

评论数 0

原创 访问修饰符public private protected

访问修饰符public private protected 一.修饰访问符修饰成员变量 1.public修饰成员变量 由于成员变量在类中是由public修饰的,所以既可以通过直接访问,也可以通过函数间接访问。 #include <iostream> using namespace s...

2019-12-17 10:52:13

阅读数 23

评论数 0

原创 inline内联函数与宏定义

内联函数与宏定义 我们知道,在调用函数的过程中是使用栈进行的调用,调用栈比较消耗内存,所以我们便想通过使用内联函数或者是宏定义来达到在减小内存的情况下进行函数调用的效果。 1.宏定义 宏定义是要先通过预处理的,优点是消耗内存小(比起栈方法调用函数宏定义是直接插入),缺点是宏定义的预处理只是简单地文...

2019-12-16 20:14:02

阅读数 14

评论数 0

原创 Static修饰class成员函数与成员变量

Static修饰class成员函数与成员变量 参考文档:https://www.runoob.com/w3cnote/cpp-static-usage.html 类名直接调用问题 1.能否通过类名调用类的非静态成员函数? 不行,因为类并没有进行对象实例化。 #include <iostrea...

2019-12-16 16:27:10

阅读数 15

评论数 0

原创 变量存放的内存五大区

变量存放的内存五大区 栈区: 用于存储局部变量,其存放数据结构和数据结构中的栈相同。 堆区: 用于存放自助申请的空间,如malloc/new,其存放数据结构类似于链表 全局静态区: 用于存放静态变量和全局变量,分为DATA段和BSS段,其中DATA段存放已经被初始化的静态变量或全局变量;BSS段存...

2019-12-16 13:18:25

阅读数 24

评论数 0

原创 全局变量与静态变量 C++

全局变量与静态变量 C++ 参考文章: https://www.runoob.com/w3cnote/cpp-static-usage.html 局部静态变量 先来一个程序理解一下:` #include <iostream> using namespace std; void f()...

2019-12-13 19:09:28

阅读数 11

评论数 0

原创 线索二叉树 C++

线索二叉树 C++ 以此二叉树为例进行创建: 前序法创建节点,输入’#'表示为NULL 用前序创建的话需要输入 :ABD##E##C#G## 前序遍历:ABD##E##C#G## 中序遍历:#D#B#E#A#C#G# 后序遍历: ##D##EB###GCA 层序遍历: ABCDEG 在...

2019-12-13 11:42:46

阅读数 19

评论数 0

提示
确定要删除当前文章?
取消 删除