
c++
znzxc
这个作者很懒,什么都没留下…
展开
-
C++ 使用for循环加auto的一个注意事项
参加了LeetCode的周赛,在使用for循环+auto遍历字符串时出现了一些问题,在VS下单步调试,发现auto方法会遍历字符串尾部 '\0',int main(){ int count = 0; for (auto c : "123456") cout<<c<<" "<<++count<<endl; getchar(); r...原创 2019-09-15 14:30:12 · 1882 阅读 · 3 评论 -
两个条件变量实现读写锁,写优先,避免写者饥饿
核心思想:用两个int记录写者数与读者数,用两个条件变量分别作为读者、写者的等待队列。class wfirtst_rwlock{public: wfirtst_rwlock() :rcount(0), wcount(0),writeflag(true) {} void readlock() { unique_lock<mutex> ul(mtx); cond...原创 2018-08-08 20:46:04 · 2490 阅读 · 0 评论 -
非递归前序遍历的另一种实现
关于二叉树前序遍历的非递归实现,大多如下,即教科书版void previsit(TreeNode*root){ if (root == NULL) return; stack<TreeNode*> sta; TreeNode*p = root; while (p || !sta.empty()) { while (p) { cout <<...原创 2018-08-08 14:47:18 · 312 阅读 · 0 评论 -
结构体中字符数组赋值字符串问题
原文链接:https://blog.youkuaiyun.com/baidu_39774741/article/details/77096792今天在看结构体变量时发现一个问题:问题代码如下int main() { struct student{ char c[20]; }s1; s1.c="china"; printf("%s",s1.c); ...转载 2018-08-02 10:30:54 · 7195 阅读 · 0 评论 -
测试mutex.lock()与mutex.try_lock()
关于try_lock()1.如果互斥锁当前未被任何线程锁定,则调用线程将其锁定(从此点开始,直到调用其成员解锁,该线程拥有互斥锁)。2.如果互斥锁当前被另一个线程锁定,则该函数将失败并返回false,而不会阻塞(调用线程继续执行)。3.如果互斥锁当前被调用此函数的同一线程锁定,则会产生死锁(具有未定义的行为)。 请参阅recursive_mutex以获取允许来自同一线程的多个锁的互斥锁类型...原创 2018-08-06 16:40:54 · 19009 阅读 · 0 评论 -
高并发网络编程之epoll详解
原文链接:https://www.cnblogs.com/alantu2018/p/8460884.html在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。本文便来介绍epoll的实现机制,并附...转载 2018-08-06 10:47:59 · 121 阅读 · 0 评论 -
5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
原文链接:https://blog.youkuaiyun.com/tjiyu/article/details/529594185种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。本文是在《UNIX网络编程 卷1:套接字联网API》6.2节"I/O 模型 "的基础上,即UNI...转载 2018-07-31 15:13:01 · 283 阅读 · 0 评论 -
printf 缓冲区问题
原文链接:https://blog.youkuaiyun.com/shanshanpt/article/details/7385649 昨天在做Linux实验的时候,后面的同学发现一个很差异的现象!废话不说,先贴代码! 就是简单的fork小程序,简化之后的代码如下:#include <stdio.h>#include <unistd.h>...转载 2018-08-09 10:42:46 · 263 阅读 · 0 评论 -
关于尾置返回类型,auto和decltype
template<class T>return_type func(T t){ return *t;}此处的return_type该如何填写,可以通过decltype()来获得此类型。但是此时t还没有出现,编译器无法判断。c++11提供了一种新的书写方式,将返回类型尾置。即template<class T>auto func(T t)-&...原创 2018-07-23 09:38:57 · 631 阅读 · 0 评论 -
关于std::swap 中实现的移动语义
在swap中,会默认使用对象的右值引用进行移动,如果 没有右值引用,则调用默认拷贝构造函数。在linux环境下进行验证。1.类中只定义了左值引用拷贝构造函数和重载运算符=。结果如下:先生成a,b对象,在swap中构建了一个局部变量,然后进行拷贝构造。2.类中定义了左值引用的拷贝构造函数、重载=和右值引用的构造函数、移动构造函数。结果如下: 在生成a,b对...原创 2018-07-25 10:04:25 · 3054 阅读 · 0 评论 -
从四行代码看右值引用
原文链接:https://www.cnblogs.com/qicosmos/p/4283455.html概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i; 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,...转载 2018-07-24 21:29:22 · 238 阅读 · 0 评论 -
C++11 std::unique_lock与std::lock_guard区别及多线程应用实例
原文链接:https://blog.youkuaiyun.com/tgxallen/article/details/73522233C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁--mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操...转载 2018-08-08 21:06:57 · 732 阅读 · 0 评论 -
C++单例模式 lock_guard+mutex+Garbo,绝对完整+清晰
class Singleton{public: static Singleton* getInstance() { if (instance == nullptr) { unique_lock<mutex> lg(mtx); if (instance == nullptr) instance = new Singleton; } retur...原创 2018-09-05 15:33:44 · 1158 阅读 · 0 评论 -
百度面试:n*n的网格有多少长方形
前两天去百度面试,一面的面试官出了这么个问题,成功解决。思路如下 选中网格中的一个点,坐标为(x,y),把这个点当做长方形的左上角定点,则此长方形的宽度变化范围是(1,n-x),高度变化范围是(1,y),对应的长方形个数是(n-x)*y,再减去高和宽相等的情况,即(n-x)*y - min(n-x,y)。完整代码如下:int main(){ int n; while (...原创 2018-09-24 09:10:46 · 2174 阅读 · 0 评论 -
简易路由表匹配算法实现(前缀树)-不考虑掩码长度
TrieNode为前缀树节点,Trie是前缀树。Trie中分为几个接口:getFourNum(),得到IP地址中的4个数字;addTree(),添加前缀树节点;searchTree(),在前缀树中进行查找。struct TrieNode{ TrieNode() :nexts{nullptr} {} int num; TrieNo...原创 2019-07-16 21:36:34 · 1799 阅读 · 0 评论 -
string解决大数相加(包含负数),清晰整洁,满足所有情况
主接口addstring,在内部根据不同的情况调用doublePositive()和minusstring(),需要注意的地方都写在注释里了string doublePositive(string s1, string s2){ int l1 = s1.size()-1, l2 = s2.size()-1; string res; int jinwei = 0; while ...原创 2019-01-25 16:56:11 · 1077 阅读 · 1 评论 -
定时器:4叉堆与2叉堆的效率比较
在学习muduo,看到定时器的实现方式,提到有一下几种实现方式。1.优先级队列,即二叉堆。2.4叉堆,libev中使用的模型即是如此,比二叉堆更高效,因为具有更好的内存局部性。3.二叉搜索树。4.使用set,以pair<timerstamp,Timer*>为key,为了区分两个timer时间相同的情况。 本文探讨2叉堆与4叉堆的效率问题。自实现了一个4-heap...原创 2019-01-06 12:29:00 · 3118 阅读 · 4 评论 -
用原始指针初始化智能指针的一些问题
class A{};int main(){ A* a = new A; cout << a << endl; shared_ptr<A> p(a); //delete a; cout << p.use_count() << endl; cout << p << endl; cout &...原创 2018-12-24 18:00:58 · 2472 阅读 · 0 评论 -
shared_ptr与weak_ptr(解决循环引用)
原创:https://blog.youkuaiyun.com/ingvar08/article/details/79200424shared_ptr是带引用计数的智能指针,可以说大部分的情形选择用shared_ptr不会出问题。那么weak_ptr是什么,应该怎么用呢? weak_ptr也是智能指针,但是比较弱,感觉没什么用。其实它的出现是伴随shared_ptr而来,尤其是解决了一个引用计数导致的问题...转载 2018-12-13 17:47:30 · 1644 阅读 · 0 评论 -
qsort与sort的区别之仿函数
qsort只接受函数指针,不接受仿函数,sort接受函数指针,也接受仿函数。原创 2018-11-14 16:47:47 · 754 阅读 · 0 评论 -
颜色直方图+余弦相似度 c++opencv实现
原理部分来自阮一峰博客http://www.ruanyifeng.com/blog/2013/03/similar_image_search_part_ii.html颜色分布法:每张图片都可以生成颜色分布的直方图(color histogram)。如果两张图片的直方图很接近,就可以认为它们很相似。任何一种颜色都是由红绿蓝三原色(RGB)构成的,所以上图共有4张直方图(三原色直方...原创 2018-11-12 11:50:37 · 4032 阅读 · 1 评论 -
正则表达式匹配IP的表达式
原文:https://www.jb51.net/article/101221.htm这里给大家详细讲解一下一个匹配IP地址的正则表达式, 有关正则方面的知识,会在详细的讲解中提到。 在讲解之前,我先给大家介绍一下,ip地址的生成规则。 IP地址,是由32位数字二进制转为四个十进制的字符串组成。 怎么转化?下面讲解: 二进制:1111111111111111...转载 2018-11-14 09:51:47 · 26961 阅读 · 9 评论 -
类成员函数重载与函数指针
在有成员函数重载的情况下该如何使用函数指针呢class l{public: void func(); void func(int, int);};void l::func(){ cout << "func()" << endl;}void l::func(int, int){ cout << "func(int,int)" <...原创 2018-10-07 14:52:01 · 860 阅读 · 0 评论 -
关于临时变量的分析,去掉编译器优化,linux环境下GDB调试
分析一下代码,调用GetA()之后,在函数内会生成一个临时对象,调用一次构造函数,然后将此临时对象拷贝给函数的返回值,调用一次拷贝构造函数,此返回值也是一个临时对象,返回值再拷贝给a对象,调用一次拷贝构造函数。总的来说,生成了3个对象,其中有2个是临时对象。#include <iostream>using namespace std;int constructcount...原创 2018-07-24 20:48:22 · 1140 阅读 · 0 评论 -
关于pair的实现
刷LeetCode遇到一种数据结构:vector<pair<int ,int>>,对pair很好奇,了解到pair是一种struct,给出以下实现方式。template<class T1,class T2>struct _pair{ T1 first; T2 second; _pair(); _pair(T1 t1, T2 t2); _pai...原创 2018-07-06 15:45:11 · 1006 阅读 · 0 评论 -
初始化列表中不能使用this指针,在构造函数体内可以
今天在初始化列表中使用了以下this指针,发现有错。于是做了以下测试。struct h{ int a; h(int x = 0) : this->a(x) { cout << this << endl; cout << this->a << endl; }}; int main(){ h n; cout...原创 2018-07-06 15:19:12 · 2099 阅读 · 2 评论 -
关于sscanf
int sscanf(const char* buffer,const char* format,[argument]...);读取格式化字符串中的数据。与scanf类似,都是用于输入的,scanf用于从键盘中(stdin)读取输入,sscanf用于从字符串中读取输入。...原创 2018-05-29 09:59:13 · 396 阅读 · 0 评论 -
守护进程
1、 守护进程的概念:守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱...转载 2018-05-23 21:53:25 · 111 阅读 · 0 评论 -
HTTP协议详解
原文地址: https://kb.cnblogs.com/page/130970/当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看。也希望对大家的开发工作或者...转载 2018-05-23 16:26:06 · 366 阅读 · 0 评论 -
malloc 与new的区别
原文链接:https://blog.youkuaiyun.com/nie19940803/article/details/76358673new和malloc的区别是C/C++一道经典的面试题,我也遇到过几次,回答的都不是很好,今天特意整理了一下。0. 属性new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持。1. 参数使用new操作符申请...转载 2018-05-22 21:25:20 · 116 阅读 · 0 评论 -
malloc、calloc、realloc
都包含在头文件 <stdlib.h>malloc:void *malloc(size_t _size)成功返回申请的堆空间地址,失败返回NULL。不会对申请空间初始化,值随机,可能遗留之前分配过的历史数据。#include <iostream>#include <stdlib.h>using namespace std;int main(){ i...原创 2018-05-22 21:18:55 · 520 阅读 · 0 评论 -
abort与assert
void abort(void);终止程序执行,直接从调用的地方跳出。头文件#include <stdlib.h>#include <stdio.h>#include <stdlib.h>int main (){ FILE *fp; fp = fopen( "abort.txt","r" );//文件并不存在 if(fp == N...原创 2018-05-21 22:37:40 · 1463 阅读 · 0 评论 -
MFC中多线程的应用
做项目中涉及到多线程的操作,所以学习了一下MFC中多线程的用法!包括线程的原创 2018-05-20 22:37:26 · 331 阅读 · 0 评论 -
关于operator bool () 和bool operator ==()
operator bool () 提供一个本类型到bool的隐式转换,不允许使用参数。bool operator ==()可以分为bool operator ==( const bool& other),bool operator ==( const T& other),T代表类型。即与bool类型的比较,和与本类的比较。#include <iostream&g...原创 2018-05-20 21:44:02 · 27597 阅读 · 4 评论 -
验证栈空间用完即销毁、增长方向向下
#include <iostream>using namespace std;void fun1(){ int a = 0; cout << &a << endl;}void fun2(){ int a = 0; cout << &a << endl;}int main(){ int a = 0...原创 2018-05-07 09:11:28 · 147 阅读 · 0 评论 -
关于constexpr
constexpr关键字让用户显式的声明函数或对象构造函数在编译期会成为常数。可以用于数组的定义:constexpr int func(){ return 10;}int main(){ int a[func()]; return 0;}...原创 2018-05-17 18:11:43 · 732 阅读 · 0 评论 -
详细剖析C++的的3种容器
原文地址:http://m.elecfans.com/article/612447.html什么是容器首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法,因为这些方法在程序的设计上会经常被...转载 2018-06-05 11:19:31 · 2986 阅读 · 2 评论 -
exit和return的区别
原文地址:https://blog.youkuaiyun.com/firefly_2002/article/details/79605951. exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统;而return 是退出当前函数,返回函数值,把控制权交给调用函数。2. exit是系统调用级别,它表示一个进程的结束;而return 是语言级别的,它表示调用堆栈的返回。3. 在main函数...转载 2018-05-29 11:45:38 · 134 阅读 · 0 评论 -
关于子类成员变量构造函数
在子类初始化时,构造函数的调用顺序是什么样的呢?基类构造函数 -> 子类成员变量构造函数 -> 子类构造函数验证:#include <iostream>using namespace std;class A{public: A() { cout << "A" << endl; } ~A() { cout << "~A&q原创 2018-06-21 18:01:31 · 283 阅读 · 0 评论 -
宏定义实现替换函数
一个简单的例子#define com(oo) \int dis(int a, int b) \{ \ return a oo b; \} com(-); int main(){ int a = 6, b = 9; cout<<dis(a, b)<<endl; g...原创 2018-07-24 15:01:03 · 9574 阅读 · 1 评论