C++
MaxMaxXiong
这个作者很懒,什么都没留下…
展开
-
std::bind可以绑定成员变量
#include <iostream>#include <string>#include <functional>using namespace std;class MyClass{public: MyClass(){} MyClass(int a): m_i(a){} ~MyClass(){} void Get(int a, string str) { cout << a << " " << str .原创 2021-09-15 09:49:15 · 775 阅读 · 0 评论 -
std::future、std::promise、std::packaged_task、std::async
#include <iostream>#include <string>#include <future>#include <thread>#include <chrono>#include <condition_variable>#include <hash_map>#include <unordered_map>using namespace std;// 使用std::promise.原创 2021-09-14 14:50:32 · 221 阅读 · 0 评论 -
C++实现定时器
定时器的主要数据: 1.一个线程变量,保存定时器线程 2.一个互斥锁,配合条件变量使用 3.一个条件变量,结合互斥锁,可以是线程不执行任务时,睡眠一段时间,在退出调用时,可以唤醒线程完成退出 4.定时执行函数,具体的定时执行业务操作 5.间隔时间,定时器间隔一段时间调用定时执行函数 6.一个退出标识,标志是否退出定时线程循环 7.立即执行标识,标识新建状态的定时线程是否立即执行一次任务,而不需等待一个间隔时间才开始执行第一次任务#include <ios...原创 2021-08-27 16:33:43 · 12778 阅读 · 0 评论 -
C++读写锁的托管包装器
// 读锁template<class T>class CReadLock{public: explicit CReadLock(T& rwmutex) : m_rwmutex_(rwmutex) { m_rwmutex_.LockRead(); } virtual ~CReadLock() { m_rwmutex_.UnLockRead(); }private: CReadLock() = delete; CReadLock(const T&.原创 2021-08-17 23:21:17 · 93 阅读 · 0 评论 -
C++读写锁- 一个互斥量、一个条件变量、一个计数变量实现读写锁
// 一个互斥量、一个条件变量、一个计数变量实现读写锁class CRWMutex2{public: CRWMutex2() : m_count_(0) { } virtual ~CRWMutex2() = default; void LockRead() { std::unique_lock<std::mutex> locker(m_mutex_); while (m_count_ < 0) m_cond_.wait(locker, [=] {r.原创 2021-08-17 22:27:48 · 352 阅读 · 0 评论 -
C++实现递归锁CRecursiveMutex
1、递归锁允许同一个线程多次加锁而不死锁,不同线程加锁和正常的互斥量一样。2、应用场景解决这后续描述的一类问题。在一个函数内给互斥量上了锁还没有解开,然后又调用了另一个函数,这个被调用的函数也去给互斥量上锁,这种情境下就会出现死锁。3、递归互斥量主要是通过对同一个线程的加锁请求计数。#ifndef _RECURSIVELOCK_H_#define _RECURSIVELOCK_H_#include <map>#include <mutex>#in原创 2021-08-17 18:29:29 · 940 阅读 · 0 评论 -
C++11 auto、decltype、is_reference、is_rvalue_reference/is_lvalue_reference、typeid
#include <iostream>#include <type_traits> // 存在is_rvalue_reference、is_lvalue_reference、is_reference模板using namespace std;/* 左值:可以取地址的、有名字的就是左值; 右值:不可以取地址的、没有名字的是右值;右值是由两个概念构成的,一个是纯右值,另一个则是将亡值。 左值引用:对左值的引用,是具名变量值的别名,声明时必须初始化,不能对左值引用重定义。.原创 2021-08-14 11:46:58 · 297 阅读 · 0 评论 -
std::map、std::set使用自定义数据的键值时注意排序
map、set插入自定义数据类型作为key时需要注意什么问题问题?!!!!!!!!首先要解决排序问题,方法有:1.重载自定义数据类型的operator<()操作符2.map类型的第三个参数为函数对象类类型,可以自定义这个比较函数的函数对象, 如申明一个类似 struct CustomLess { bool operator()(const CustomKey2& other1, const CustomKey2& other2) { ...原创 2021-08-10 23:48:51 · 681 阅读 · 0 评论 -
C++模板全特化(具体化)与偏特化(部分具体化)详解
1.模板简介模板就是实现代码重用的一种机制,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模板编程和函数重载可以实现C++静态多态,也叫编译时多态。模版可以分为两类,一个是函数模版,另一个是类模版。2.模板特化的目的模板本来是一组通用逻辑的实现,但是可能存在特定的参数类型下,通用的逻辑实现不能满足要求,这时就需要针对这些特殊的类型,而实现一个特例模板—即模板特化。3.重点注意1)类模板和函数模板都可以被全特化;2)类模板能偏特化,不能被重载;...原创 2020-06-19 17:58:02 · 3932 阅读 · 4 评论 -
C++四种类型转换运算符const_cast、static_cast、dynamic_cast、reinterpret_cast相关实验总结
1.const_cast<type-name>(expression)目标类型只能是指针或者引用,作用是去掉类型的const或volatile属性2.static_cast<type-name>(expression)类似于C风格的强制转换,无条件转换,但没有运行时类型检查来保证转换的安全性,所以在编译时已经完成转换。 static_cast一般用于基本类型转换。 1)基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安...原创 2020-06-12 16:03:10 · 653 阅读 · 0 评论 -
C++读写锁-实现优先写
#ifndef _RWLOCK_H_#define _RWLOCK_H_#include <mutex>#include <condition_variable>// 读写互斥量// 当有写和读操作同时竞争时,写操作优先与读操作class CRWMutex{public: CRWMutex() : m_read_count_(0) , m_write_count_(0) , m_is_writing_(false) { } virtual .原创 2020-06-08 17:31:15 · 792 阅读 · 0 评论 -
C++多态与虚函数相关实验说明
void Test_Polym_Virtual_Func(){ cout << "Test_Polym_Virtual_Func" << endl; // 测试虚函数 class A { public: A(){ cout << "A Constructor." << endl; f(); g(); m_p1_ = new int; *m_p1_ = 1; } virtual~A(){ cout << "A Destructo.原创 2020-06-08 14:56:56 · 317 阅读 · 0 评论 -
C++继承与组合关系中构造函数与析构函数执行顺序
/* 测试继承与组合关系中构造函数与析构函数执行顺序 在继承关系中:先调用基类构造函数,再调用子类构造函数 针对包含自定义类型成员变量的情况,先构造成员变量,在调用自己的构造函数 析构函数与构造函数调用顺序相反*/void Test_Constructor_Destructor_Sequence(){ cout << "Test_Constructor_Destructor_Sequence" << endl; // 测试包含继承关系和自定义成员变量的 clas.原创 2020-06-08 14:14:04 · 407 阅读 · 0 评论 -
emplace_back与push_back的区别
C++11中经常用到插入操作对stl的各种容器进行操作,比如vector,map,set等,以vector为列,当数据类型实现了移动构造函数时,push_back()插入一个右值时,会先调用构造函数创建临时对象,再调用移动构造函数将对象放置到容器中,如果数据类型没有实现移动构造函数,push_back()插入一个右值时,会先调用构造函数创建临时对象,再调用拷贝构造函数将对象放置到容器中;而emplace_back()一个右值时,都是在插入的时候直接构造对象,不需要调用移动构造函数或拷贝构造函数;如下列子:原创 2020-05-12 21:24:44 · 649 阅读 · 0 评论 -
unique_ptr智能指针的简单实现
#ifndef UNIQUE_PTR_H#define UNIQUE_PTR_H#include <stdio.h>#include <iostream>using namespace std;// unique_ptr对象始终是关联的原始指针的唯一所有者。// 无法复制unique_ptr对象,它只能移动template <typename T...原创 2020-03-30 13:22:38 · 377 阅读 · 0 评论 -
包含string对象的结构与memset初始化操作
一、案例背景在参与某一项目开发中,发现客户端存在一个偶现的崩溃问题;查看dump信息,只保存了使用VS2008运行程序崩溃时的STMSGEVENT结构变量信息,STMSGEVENT结构中包含的szExtInfo结构信息中strText信息异常,strText是std::string类型的,strText正常情况下应该存在有效内容的。通过进一步分析发现,在客户端代码中,STMSGEVENT申明处...原创 2018-12-18 18:55:08 · 3722 阅读 · 2 评论 -
C++将二进制图片数据转换为JPG格式
包含头文件#include "opencv2/opencv.hpp"// strPhotoData为string类型,包含二进制图片数据std::vector<char> vec_data(strPhotoData.begin(), strPhotoData.end());cv::Mat mat = cv::imdecode(cv::Mat(vec_data), CV_LOA...原创 2018-12-03 21:58:28 · 5461 阅读 · 1 评论 -
C++中new和new(std::nothrow)
在C++编码中使用new分配堆内存时,进行Test-for-NULL检查是一个好习惯。但是注意这个点:1.new在操作符new 和new [ ]内存分配失败的时候抛出的异常,在分配异常的情况下这时的指针myarray不为NULL;char *p = new char[iSize + 1];if (NULL == p) // 进行Test-for-NULL检查,自欺欺人{...原创 2018-12-03 11:34:04 · 1419 阅读 · 2 评论 -
std::string源码详细解析
1.std::string简介查看std::string 类型C++源码,std::string类来源于typedef basic_string<char, char_traits<char>, allocator<char> > string;basic_string类型的继承关系如下:class basic_string à class _Str...原创 2018-11-29 09:45:17 · 7016 阅读 · 0 评论 -
C++检测内存泄漏方法
1.检测内存泄漏方法这里先介绍一下windows下VS运行C/C++工程检测内存泄漏的方法。Visual Studio 调试器和 C 运行时 (CRT) 库为我们提供了检测和识别内存泄漏的有效方法。VC++ IDE 的默认状态是没有启用内存泄漏检测机制的,也就是说即使某段代码有内存泄漏,Output 窗口也不会输出有关内存泄漏信息。必须手动设定两个最基本的机关来启用内存泄漏检测机制。一...原创 2018-11-23 18:25:29 · 4481 阅读 · 0 评论 -
C++智能指针unique_ptr
C++11:unique_ptr、shared_ptr、weak_ptr,本节介绍一下unique_ptr1.智能指针产生原因众所周知,C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。然而,很多程序员在使用堆内存时都很头疼,因为一次不恰当的使用方法,很容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等。所以C++引入了智能指针,使用使...原创 2018-12-20 17:19:11 · 712 阅读 · 0 评论 -
UMDH帮助排查内存持续增长问题
1.简介umdh是windows debug tools下的一款命令行工具,它的全名是User-Mode Dump Heap 这个工具会分析当前进程在堆上分配的内存,通过命令操作,可以对当前进程分配的每一块内存做日志记录,其中包含分配的内存大小、内存分配地址、内存分配时的函数调用堆栈等;还可以通多命令操作,比较几个顺序时间的日志记录,找出内存增长的位置。2.步骤在已经安装windbg的...原创 2019-04-11 14:01:04 · 1800 阅读 · 0 评论 -
找出数组中每个元素右边第一个比它大的元素
题目:给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值。要求时间复杂度O(n)。借助栈结构可以一次遍历完数组,得到结果。#define INVALID_MAX -1vector<int> findMax(vector<int> num){ if(num.size()==0) return num; ...原创 2019-05-05 15:45:37 · 2439 阅读 · 1 评论 -
shared_ptr智能指针的简单实现
#ifndef SHARED_PTR_H#define SHARED_PTR_H#include <stdio.h>#include <iostream>using namespace std;template <typename T> // 泛型编程class Shared_ptr{public: Shared_ptr() : m_p...原创 2019-05-06 11:47:38 · 155 阅读 · 0 评论 -
算法实现--找出一个字符串中第一个无重复字符
下面代码中使用自定义的高精度计时器,统计两种方案消耗时间。/*编写一个高效率函数来找出一个字符串中第一个无重复字符.例如:”total”中的o,”teeter”中的r.要求算法效率优于O(n2).字符串中的字符均存在于ASCII表中。*/#include <iostream>#include "StopwatchTime.h" // 计时接口#define AS...原创 2020-04-06 17:57:15 · 214 阅读 · 0 评论 -
单例模式实现
实现线程安全的泛型单例模式#ifndef __SINGLETON_H__#define __SINGLETON_H__#include <mutex>#include <memory>template <class T>class CSingleton{public: static T& Instance();priva...原创 2019-05-06 23:10:38 · 391 阅读 · 0 评论 -
算法实现--KMP算法-匹配字符串
/*有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?*//*** @brief 暴力匹配* @param[in] s 主串* @param[in] p 模式串* @note 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;如...原创 2019-06-06 15:39:29 · 223 阅读 · 0 评论 -
算法实现--二分查找-数组中负数与正数
/* 一个数组中中间部分都是0,前半部分全是负数,后半部分都是正数,要求时间复杂度尽量低的情况下,查找最后一个负数和第一个正数。 题目中描述的数组,求解结果是与0比较的,可以看做是有序的,使用二分查找,时间复杂度可以达到log(n)*/#include <vector>#include <iostream>using namespace std;/...原创 2019-06-03 19:13:00 · 1446 阅读 · 0 评论 -
C++智能指针auto_ptr
C++98:auto_ptr1.智能指针产生原因众所周知,C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。然而,很多程序员在使用堆内存时都很头疼,因为一次不恰当的使用方法,很容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等。所以C++引入了智能指针,使用使用智能指针能更好的管理堆内存。2.理解智能指针原理1)智能指针是利用了...原创 2018-12-20 14:47:28 · 174 阅读 · 0 评论