自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (4)
  • 收藏
  • 关注

原创 cookie,session,token的区别和作用

1.cookie,session,token的出现的背景很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。这段时间很嗨皮但是随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等,马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分

2021-11-16 15:47:37 1025

原创 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 774

原创 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

原创 C++实现定时器

定时器的主要数据: 1.一个线程变量,保存定时器线程 2.一个互斥锁,配合条件变量使用 3.一个条件变量,结合互斥锁,可以是线程不执行任务时,睡眠一段时间,在退出调用时,可以唤醒线程完成退出 4.定时执行函数,具体的定时执行业务操作 5.间隔时间,定时器间隔一段时间调用定时执行函数 6.一个退出标识,标志是否退出定时线程循环 7.立即执行标识,标识新建状态的定时线程是否立即执行一次任务,而不需等待一个间隔时间才开始执行第一次任务#include <ios...

2021-08-27 16:33:43 12760

原创 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 92

原创 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 351

原创 C++实现递归锁CRecursiveMutex

1、递归锁允许同一个线程多次加锁而不死锁,不同线程加锁和正常的互斥量一样。2、应用场景解决这后续描述的一类问题。在一个函数内给互斥量上了锁还没有解开,然后又调用了另一个函数,这个被调用的函数也去给互斥量上锁,这种情境下就会出现死锁。3、递归互斥量主要是通过对同一个线程的加锁请求计数。#ifndef _RECURSIVELOCK_H_#define _RECURSIVELOCK_H_#include <map>#include <mutex>#in

2021-08-17 18:29:29 939

原创 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 294

原创 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 673

原创 算法实现--二分查找-0~n-1中缺失的数字

/************************************************************************/ /* 剑指 Offer 53 - II. 0~n-1中缺失的数字 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例 1: 输入: [0,1,3] 输出: 2 示例2: 输入: [0,1,2,3,4,5,6,7,9..

2021-06-13 17:06:39 285

原创 算法实现--二分查找-在排序数组中查找元素的第一个和最后一个位置

/************************************************************************/ /* 34. 在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗? 示例 1: 输入..

2021-06-13 15:52:24 201

原创 算法实现--二分查找-旋转数组的最小数字

/* 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 来源:力扣(LeetCode) 链接:ht...

2021-06-13 15:51:03 71

原创 C++模板全特化(具体化)与偏特化(部分具体化)详解

1.模板简介模板就是实现代码重用的一种机制,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模板编程和函数重载可以实现C++静态多态,也叫编译时多态。模版可以分为两类,一个是函数模版,另一个是类模版。2.模板特化的目的模板本来是一组通用逻辑的实现,但是可能存在特定的参数类型下,通用的逻辑实现不能满足要求,这时就需要针对这些特殊的类型,而实现一个特例模板—即模板特化。3.重点注意1)类模板和函数模板都可以被全特化;2)类模板能偏特化,不能被重载;...

2020-06-19 17:58:02 3897 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 652

原创 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 790

原创 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 316

原创 C++继承与组合关系中构造函数与析构函数执行顺序

/* 测试继承与组合关系中构造函数与析构函数执行顺序 在继承关系中:先调用基类构造函数,再调用子类构造函数 针对包含自定义类型成员变量的情况,先构造成员变量,在调用自己的构造函数 析构函数与构造函数调用顺序相反*/void Test_Constructor_Destructor_Sequence(){ cout << "Test_Constructor_Destructor_Sequence" << endl; // 测试包含继承关系和自定义成员变量的 clas.

2020-06-08 14:14:04 407

原创 emplace_back与push_back的区别

C++11中经常用到插入操作对stl的各种容器进行操作,比如vector,map,set等,以vector为列,当数据类型实现了移动构造函数时,push_back()插入一个右值时,会先调用构造函数创建临时对象,再调用移动构造函数将对象放置到容器中,如果数据类型没有实现移动构造函数,push_back()插入一个右值时,会先调用构造函数创建临时对象,再调用拷贝构造函数将对象放置到容器中;而emplace_back()一个右值时,都是在插入的时候直接构造对象,不需要调用移动构造函数或拷贝构造函数;如下列子:

2020-05-12 21:24:44 648

原创 算法实现-二叉树相关

#pragma once#include <stack>#include <queue>#include <vector>#include <iostream>using namespace std;namespace BinaryTree{ void PrintFunStr(string funStr) { printf...

2020-04-07 00:32:43 132

原创 算法实现-排序相关

#pragma once#include <vector>#include <string>#include <iostream>using namespace std;namespace Sort{ // 基本思想:通过一趟排序将数分割为左,右两部分,并选择出基数,使得左边的都得基数小,右边的都比基数大,并依此递归操作。 // 1. ...

2020-04-06 20:18:43 141

原创 算法实现--判断两个字符串是否互为旋转词

/*旋转字符串判断:如果对于一个字符串A,将A的前面任意一部分挪到后边去形成的字符串称为A的旋转词。比如A="12345",A的旋转词有"12345","23451","34512","45123"和"51234"。对个字符串A和B,请判断A和B是否互为旋转词。给定两个字符串A和B,请返回一个bool值,代表他们是否互为旋转词。测试样例:"cdab","abcd"返回:true*...

2020-04-06 17:57:52 121

原创 算法实现--给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"w...

2020-04-06 17:57:30 3523

原创 算法实现--找出一个字符串中第一个无重复字符

下面代码中使用自定义的高精度计时器,统计两种方案消耗时间。/*编写一个高效率函数来找出一个字符串中第一个无重复字符.例如:”total”中的o,”teeter”中的r.要求算法效率优于O(n2).字符串中的字符均存在于ASCII表中。*/#include <iostream>#include "StopwatchTime.h" // 计时接口#define AS...

2020-04-06 17:57:15 212

原创 算法实现--二维数组-查找数字

/* 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 利用二维数组由上到下,由左到右递增的规律, 那么选取右上角或者左下角的元素a[row][col]与target进行比较, 当target小于元素a[row][c...

2020-04-06 17:54:54 77

原创 算法实现--字符串替换空格

/* 题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路: 问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换! 问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。 从前往后替换,后面的字符要不断...

2020-04-06 17:54:41 91

原创 算法实现--list相关

#pragma once#include <vector>#include <string>#include <iostream>using namespace std;namespace List{ struct ListNode { int val; ListNode* next; ListNode(int x) : val(...

2020-04-06 17:54:13 187

原创 算法实现--求和为s的连续正数序列.

求和为s的连续正数序列.如,输入9,输出序列:{2,3,4}、和{4,5}下面是暴力循环法:// 暴力法vector<vector<int>> FindContinuousSequence(int target) { int sum = 0; vector<vector<int>> result; for (int i = 1;...

2020-04-06 17:53:28 132

原创 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 376

原创 算法实现--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

原创 C++ 与String与WString相互转换

#include <wchar.h>#include <windows.h>/** @fn std::wstring String2WString(const std::string& str_in)* @brief string转换为wstring* @param (IN) const std::string&* @return st...

2019-06-06 15:03:03 1156

原创 算法实现--二分查找-数组中负数与正数

/* 一个数组中中间部分都是0,前半部分全是负数,后半部分都是正数,要求时间复杂度尽量低的情况下,查找最后一个负数和第一个正数。 题目中描述的数组,求解结果是与0比较的,可以看做是有序的,使用二分查找,时间复杂度可以达到log(n)*/#include <vector>#include <iostream>using namespace std;/...

2019-06-03 19:13:00 1444

原创 单例模式实现

实现线程安全的泛型单例模式#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 382

原创 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

原创 找出数组中每个元素右边第一个比它大的元素

题目:给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值。要求时间复杂度O(n)。借助栈结构可以一次遍历完数组,得到结果。#define INVALID_MAX -1vector<int> findMax(vector<int> num){ if(num.size()==0) return num; ...

2019-05-05 15:45:37 2438 1

原创 UMDH帮助排查内存持续增长问题

1.简介umdh是windows debug tools下的一款命令行工具,它的全名是User-Mode Dump Heap 这个工具会分析当前进程在堆上分配的内存,通过命令操作,可以对当前进程分配的每一块内存做日志记录,其中包含分配的内存大小、内存分配地址、内存分配时的函数调用堆栈等;还可以通多命令操作,比较几个顺序时间的日志记录,找出内存增长的位置。2.步骤在已经安装windbg的...

2019-04-11 14:01:04 1797

原创 centos7下编译安装make-3.13.2

1.下载cmake源码[root@localhost download]# wget https://github.com/Kitware/CMake/releases/download/v3.13.2/cmake-3.13.2.tar.gz2.解压 cmake-3.11.2.tar.gz 文件[root@localhost download]# tar -zxvf cmake-3...

2019-01-11 18:24:29 2859

原创 linux centos7.x防火墙设置

1.firewalld的基本使用查看防火墙状态: systemctl status firewalld开启防火墙: systemctl start firewalld关闭防火墙: systemctl stop firewalld重启防火墙: systemctl restart firewalld开机禁用防火墙: systemctl disable firewalld开机启用防火墙: ...

2019-01-11 10:38:06 332

原创 查看centos版本

1.打开终端,接着会弹出终端窗口2.在里面输入“cat  /etc/redhat-release”命令 3.回车后就可以输出centos系统的版本4.使用“uname  -a”命令可以查看内核版本等信息...

2019-01-10 09:56:30 2784

原创 win7本机ping不通虚拟机,虚拟机可以ping通win7主机

1.将虚拟机设置为NAT模式(VMnet8)点击虚拟机工具栏:编辑-&gt;虚拟网络编辑器2.关闭虚拟机的防火墙设置service iptables stop确定是否关闭service iptables status3.在linux使用ifconfig查看ip,如图可看出ip是192.168.159.1284.回到win7本机,进入cmd使用ipconfig,查...

2019-01-09 20:25:22 3502

原创 C++智能指针unique_ptr

C++11:unique_ptr、shared_ptr、weak_ptr,本节介绍一下unique_ptr1.智能指针产生原因众所周知,C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。然而,很多程序员在使用堆内存时都很头疼,因为一次不恰当的使用方法,很容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等。所以C++引入了智能指针,使用使...

2018-12-20 17:19:11 708

DES算法实现-分组模式-数据补位.doc

DES是对称的,也就是说它使用同一个密钥来加密和解密数据。与此相对的是RSA加密算法,是一种非对称加密算法。DES是一种用56位密钥来加密64位数据的方法。一般密码长度为8个字节,其中56位加密密钥,每个第8位都用作奇偶校验

2020-05-05

tcpip详解里-sock-0.3.2程序

这个包是Tcp/Ip详解卷一里面的提到sock-0.3.2程序,需要注意的是在linux root用户名称下解压sock-0.3.2包,然后执行说明里面的命令,即可完成安装,然后就可以配合Tcp/Ip详解卷一书里讲的进行操作

2019-01-18

VA_X_Setup2210 + VA_X.dll破解补丁,支持2008-2017均可用

VA_X_Setup2210 + VA_X.dll破解补丁,支持2008-2017均可用。 在用户路径下找到VA_X.dll文件,使用下载的VA_X.dll文件替换即可。 在VisualStudio这个文件夹里面有与你当前安装的VS相关的文件夹,我只装了VS2015版本的,所以这里只有一个文件夹。 10.0表示VS2010,11.0表示2012,12.0表示VS2013,14.0表示VS2015。我们进入这个文件夹内,然后复制粘贴VA_X.dll这个文件在当前文件夹下,然后软件破解就OK了。

2019-01-12

包含string对象的结构与memset初始化操作

memset初始化std::string对象时,按字节顺序将std::string对象所在空间清零,破坏了std::string对象的成员结构,使Myroxy指针资源变为野指针,操作其迭代器会出现不可预知的异常,在存储字符串时可能分配了不必要的内存空间,并且还导致这些内存不能被释放。 回到memset函数,它设计的初衷是对结构资源连续的空间进行赋值操作,而对于较为复杂和抽象的类型,包括我们自定义的各种业务类型,这些类型中可能存在多层继承关系,那么这些结构资源中就隐藏着虚函数表、虚指针,对于多层聚合、组合的类型也会存在自定义类型的指针对象,这些资源都可能不是连续的空间去存储,如果使用memset去初始化这类资源,自然是违背了memset设计初衷,导致程序出现不可预知的异常。 除了memset函数外,在使用memcpy、_memccpy、memove这些函数操作上述的资源时,也需要注意类似的异常发生。

2018-11-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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