![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++语言区
yanerhao
信雅之言,微言大意
展开
-
tbb::concurrent_queue 高性能的奥秘
在 如今的多线程开发的滚滚浪潮中,线程安全会是一个充满正面色彩的广告语,还是一个隐含性能低下令人不安的信息?众所周知,STL库所提供的容器均不能保证 线程安全,所有的工作都要需要开发者来承担。最简单的实现线程安全的手段便是使用锁来同步对容器的访问,只需要lock和unlock两行语句,容器就变 成线程安全了,很简单,不是吗?不过,这时候"线程安全"就成了性能低下的同名词,期望的并发操作成了对容器的...原创 2019-10-09 14:49:51 · 4527 阅读 · 0 评论 -
AVL树C++模板类实现
注意模板类,声明和定义在同一个文件里Tree.h/***********avl**********////Tree.h// #ifndef AVL_BLOCK#define AVL_BLOCKtemplateclass Treenode{ public: T val; int height; int freq; Treenode*lson; Treenode*r原创 2016-11-13 13:44:56 · 558 阅读 · 0 评论 -
C++ static的总结
基于C++是面向过程也是面向对象的高级程序设计语言,故C++里出现的关键词static也跟着有两种用法:1:面向过程的static2:面向对象的static1:面向过程的static面向过程的static,首先需要一个完整的程序在内存中存储如下:栈区由编译器申请与释放主要针对局部变量堆区由程序员申请释放主要用于动态申请与释放全局静原创 2016-11-15 23:09:35 · 294 阅读 · 0 评论 -
基于模板参数的友元重载opearto<<常见问题
对于模板下的类定义,一般重载operator我们习惯性写法:templateclass A{public: A(string value): data(value){} friend ostream& operator& me);private: T data;}; templateostream& operator& me){ cout原创 2016-10-12 21:15:59 · 641 阅读 · 1 评论 -
基数排序C/C++
目前主流内排序两大类:一类是比较关键字大小,这一类很常见,比如:插入排序:直接插入排序(稳定)和希尔排序(升级版,不稳定);选择排序:直接选择排序(不稳定)和堆排序(以完全二叉树为基础,不稳定);交换排序:冒泡排序(稳定)和快速排序(升级版,不稳定);归并排序(选择基准,稳定);还有有一类是不必比较关键字如基数排序,她是根据关键字中各位的值通过对排序的n个元素进行分配和收集原创 2016-08-02 20:48:47 · 763 阅读 · 0 评论 -
只使用I/O的输入单数字的函数,实现任意实数的输出
给定一个double型数据a=1.344,如果不清楚其存储格式,很有可能犯如下错误:double a=1.344;int b=a;//1double c=a-b;//3.44c*1000以为就是344,但实际上编译器显示的是343;而当a=1.345时,最终c*1000显示的就是345.很明显,这就涉及到double型数据的存储格式double a=8.1,在存储中存储为8.09原创 2016-08-05 10:32:13 · 502 阅读 · 0 评论 -
中缀表达式求后缀,再由后缀表达式求值
人:中缀表达式计算机:后缀表达式需要进行中缀转后缀,再计算。无论哪一步都需栈:对于(3 + 4) × 5 - 6 一 中缀转后缀涉及的栈用来存储符号如“+ - × / ( )”思想:遇见数字输出;遇见符号入栈当空栈或者符号是左括号时直接入栈 ;当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈;当运算符是右括号原创 2016-05-08 17:06:47 · 786 阅读 · 0 评论 -
C++推荐书籍
人的精力是有限的,当前计算机相关书籍相当丰富,所谓林子大了什么鸟都有,所以首先不要乱读书,以免被误导或浪费时间。这样我们学习的步骤第1是选书,第2是按顺序看书。 以下是我个人认为值得推荐之书:一.c++程序员看的书://------------------------------------------------------------// 入门://转载 2015-11-08 12:26:05 · 479 阅读 · 0 评论 -
递归实现数组全排列
设计一个递归算法求n个不同字符的所有全排列:例如123:123,132,213,231,312,321要点:1.n个元素的排列=(n-1)的排列+剩下元素作为前缀;2.如果只有一个元素的全排列,说明已经排列好,可以输出排列结果;3.不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;void getarr(c原创 2015-09-13 19:24:26 · 4092 阅读 · 0 评论 -
strlen与sizeof的区别
一、sizeof sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的原创 2015-09-11 10:11:54 · 310 阅读 · 0 评论 -
C++常指针与指针常量
C++有C语言特点,指针便是最重要打特征之一:常指针格式:const 类型×指针名如const int *p这种指针指的是常量指针即:不能通过该指针的间接引用改变其值;但是指针所指变量本身可以改变,指针变量也可以被不同地址赋值。指针常量格式:类型×const 指针名=初始地址如int *const p=&a这种指针定义时候就被初始化,以后所存地址都不能改变,但是可以通过原创 2016-11-01 20:51:00 · 2696 阅读 · 1 评论 -
伸展树C++类实现<一>自低向上设计
伸展树C++类实现原创 2016-11-19 21:15:49 · 960 阅读 · 0 评论 -
伸展树C++类实现<二>自顶向下设计
上一篇主要基于父节点形式的自底向上的设计实现伸展树,这一篇将实现基于左右辅助树的自顶向下的设计。这种方式不需要节点存储其父节点的指针。当我们沿着树向下搜索某个节点x时,将搜索路径上的节点及其子树移走。构建两棵临时的树——左树和右树。没有被移走的节点构成的树称为中树。且有以下原则:1)当前节点x是中树的根;2)左树L保存小于x的节点且L上的每个节点值都要比中树的小,故当从中树移动接到到左原创 2016-11-21 20:39:26 · 702 阅读 · 0 评论 -
cmake学习
转自:http://blog.atime.me/note/cmake.html 结CMake的常用命令,并介绍有用的CMake资源。CMake意为cross-platform make,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单。简单的例子一个完整的Demo可参考这里...转载 2018-10-23 18:35:07 · 207 阅读 · 0 评论 -
构造函数析构函数是否为虚函数
1 构造函数不能为虚函数,原因主要如下虚函数的调用需要虚函数表指针,而该指针存放在对象的内容空间中。内存空间需要构造函数完成初始化;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数——构造函数了。2 析构函数可以为虚函数首先析构函数可以为虚函数,而且当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存原创 2017-10-19 22:40:21 · 723 阅读 · 0 评论 -
libevent的了解
概念libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。它被众多的开源项目使用,例如大名鼎鼎的memcached等。特点:事件驱动,高性能;轻量级,专注于网络(相对于ACE);开放源码,代码相当精炼、易读;跨平台,支持Windows、Lin原创 2017-09-06 00:21:39 · 448 阅读 · 0 评论 -
C++ boost
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,在C++社区中影响甚大,其成员已近2000人。 Boost库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。Boost中比较有名气的有这么几个库:Regex:正则表达式库; Spirit LL parser f原创 2017-09-13 16:53:18 · 545 阅读 · 0 评论 -
C++/JAVA/Python联系与区别
总而言之:python:适合小工具小程序快速开发,无论是网站还是小游戏都非常方便。但python的脚本的运行效率较低,不适合对运行效率要求较高的程序;JAVA:采用严格的面向对象编程方法,同时有很多大型的开发框架,比较适合企业级应用;C++:C++是多范式编程语言。它不仅支持传统的面向过程编程,也支持面向对象编程,而且引入范形编程,C++运行效率较高,同时能够比较容易地建立大型软件,适原创 2017-08-24 01:12:05 · 7340 阅读 · 0 评论 -
C++智能指针<二>
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷原创 2017-08-27 20:25:08 · 258 阅读 · 0 评论 -
C++智能指针<一>
智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期。尤其的完成指针的自动删除以及指针指向内存区域的清理。否则有可能导致野指针或者内存泄漏问题。在智能指针中,一个对象什么时候和在什么条件下要被析构或者是删除是受智能指针本身决定的,用户并不需要管理。本质是C++RAII机制的体现。C++面试过程中,很多面原创 2017-08-27 17:10:13 · 636 阅读 · 0 评论 -
笔试题里螺旋矩阵的C++简单实现
最近笔试时,被人问道螺旋矩阵的输出问题,当时紧张,想的不是很透彻,回去研究一番,实现如下:比如N=4的矩阵:1 2 3 4 ----a排12 13 14 511 16 15 610 9 8 7 -------c排 | | d排 b排 首先确定的是需要一个二维数组ar[N]原创 2015-04-09 19:58:31 · 6279 阅读 · 0 评论 -
应用于外存查找树的B-树分析
B-的引入查找树中的二叉搜索树(二叉查找树)、及其延伸AVL树/伸展树等等都是当数据存储在内存中对应的搜索结构。当我们在内存数据中搜索的时候,用AVL树表示就可以获得很好的搜索性能了。但是,当数据量很大的时候,内存已经无法容纳了,我们就只好把数据存储在外存(如磁盘)中,这个时候由于磁盘读取数据非常耗时。磁盘的读写时间远远慢于内存访问的时间。如果我们可以减少磁盘存取操作的次数,那么就可以提高外搜原创 2016-11-24 22:42:26 · 953 阅读 · 0 评论 -
C/C++中sscanf && sprintf()
sscanf() - 从一个字符串中读进与指定格式相符的数据:函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... );与scanf类似都是用于输入,只不过scanf用于从屏幕(stdio)输入,原创 2015-08-06 19:40:02 · 1587 阅读 · 1 评论 -
POJ2950花生问题
Description鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花原创 2015-07-21 11:50:36 · 2003 阅读 · 0 评论 -
set,map用于统计输出
读入整数,数量不定,当输入0结束,求出现的数及其次数:int main(){int a;multisetss;cout<<"enter"<<endl;cin>>a;while(a!=0){ss.insert(a);cin>>a;}cout<<"the inf:"<<endl;multiset::iterator p;for(p=ss.begin();p!=ss.end();原创 2015-05-08 18:46:43 · 373 阅读 · 0 评论 -
快速排序基于不同枢纽的实现方法
快速排序法事应用最广泛的排序算法之一,最佳情况下时间复杂度是 O(nlogn)。但是最坏情况下可能达到O(n^2)。说明快速排序达到最坏情况的原因。并提出改善方案并实现之。改进方案:通过改变枢轴值得选取:1 选择数组头数字int part(int a[],int first,int last){ int pivote=a[first]; int low=first+1; int原创 2015-05-02 11:32:38 · 814 阅读 · 0 评论 -
C++定义的创建异常类
在固有的try-throw-catch模块里,catch(argument) 的参数除了是普通数据类型,还可以是类的对象,比如C++定义的用于创建异常的对象的类:整个类层次的根是exception类,定义于头文件,类中含有虚函数what,返回一个异常对象的错误信息;runtime_error类,定义于头文件,是个描述运行时错误的标准异常类的基类。例如overflow_error类描原创 2015-04-14 20:38:55 · 1210 阅读 · 0 评论 -
定义一个字符串类
我们知道在C++里不同于C,对于字符串如何表示有两种方式:一种是把字符串作为字符数组来处理,即基于指针的字符串或称作C字符串:arr[]="city is good" 或者*arr={'c','i','t','y','\0'};一种是C++库里面提供的string类,可以利用它创建字符串,利用成员函数进行字符串,但是C++库只给出相应接口,如何实行已经封装好。为此我们可以不厌其烦研究如何实原创 2015-04-13 21:15:20 · 3972 阅读 · 0 评论 -
为创建的一个自定义数据类型进行运算符重载
在前面一篇文章里谈到编程语言里面只有Int,float,double等基本数据类型,而没有有理数类型,因此我们自定义了一个Rational类型(见http://blog.csdn.net/yanerhao/article/details/45009283),表示有理数,含有四则运算,比较,输出结果等成员函数,但是与常见的基本类型相比,还是显得特殊,显得格格不入。需要进一步基本化,这就是需要运算符重原创 2015-04-12 18:35:31 · 2293 阅读 · 0 评论 -
有理数类的定义与实现
一个有理数是由一个分子和分母组成的a/b形式的数。我们知道一般程序语言里已经定义了整形类,浮点型,字符型,但并不支持有理数型。这对于分数的精确计算如1/3=0.33333....不能用double 或者float精确表示,所以有必要自己定义一个有理数类Rational类:含有分子nume和分母deno两个数据域;可以进行加减乘除比较,转换等多种函数定义的类如下:int gys(in原创 2015-04-12 13:30:49 · 8670 阅读 · 0 评论 -
C++文件输入输出
保存在变量,数组,对象中的数据都是暂时性的,当程序退出以后就会丢失,为了永久性保存程序中有用数据,需要将数据以文件形式保存于磁盘或者光盘等物理介质。C++文件主要是两种:文本文件和二进制文件:例如C++源程序是存储在文本文件,而最后的可执行程序是二进制文件。当然计算机本身是不区分二进制文件和文本的,文件实际物理存储统一都是二进制格式,也即文本IO也是基于二进制IO的,只不过在此之上提供了一层字符编原创 2015-04-11 20:41:07 · 808 阅读 · 1 评论 -
最大公约数,最小公倍数,求素数,偶数,奇数
平时项目时候,有时需要调用一些小函数:求该数字是奇数:bool iseven(){bool f=true; int re=value%2; if(re==0) { f=false;} if(f) return true; else return false;}求该数字是偶数:bool isodd(){bool f=true原创 2015-04-11 21:49:18 · 621 阅读 · 0 评论 -
自定义一个vector向量类
C++标准模板库STL给出了vector,list,deque,stack,set,map等模板类,平时我们直接使用居多,对于类内部怎么实现不在意。现在以向量类vector为例,简单自定义:其UML:vetor-数组名ele:T-数组目前大小size:int-数组容量cap:int+vector();//用指定元素类型创建一个空向量+sure():void//当增加元素原创 2015-04-18 10:59:02 · 7143 阅读 · 0 评论 -
STL容器
的原创 2015-05-02 16:07:07 · 406 阅读 · 0 评论 -
迭代器
的原创 2015-05-02 16:51:30 · 454 阅读 · 0 评论 -
迭代器失效
在使用vector或者deque类的迭代器进行inset或者erase操作时候,会有如此情况:即迭代器失效问题。当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作:p=de.insert(p+1,555);p=de.begin原创 2015-05-03 16:00:08 · 520 阅读 · 0 评论 -
POJ2743字符串比较
先贴最终代码:#include#include#includeint stricmp1(char*s1,char *s2){int l=strlen(s1);int l2=strlen(s2);if(l!=l2)return 1;int i;for(i=0;i<l;i++) if(s1[i]>='A'&&s1[i]<='Z')s1[i]=s1[i]+32;for(i=0;i原创 2015-07-20 11:03:19 · 769 阅读 · 0 评论 -
POJ1008玛雅历
描述上周末,M.A. Ya教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法。这个Haab历法拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin原创 2015-07-20 17:09:09 · 867 阅读 · 0 评论 -
POJ2964日历问题
Description在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。Input输入包含若干行,每行包含一个正整数,表示原创 2015-07-20 15:36:35 · 1035 阅读 · 0 评论 -
POJ2712细菌繁殖
Description一种细菌的繁殖速度是每天成倍增长。例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。Input第一行有一个整数n,表示测试数据的数目。其后n行每行有5个整数,整数之间用一个空格隔开。第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的原创 2015-07-20 14:47:03 · 1477 阅读 · 0 评论