
C&C++
文章平均质量分 87
yongh701
这家伙很聪明,什么都没有留下
展开
-
【C++】头文件<string.h>有毒,<string>才是正道
在C++中,因为字符串并不是特定类型,所以要在使用字符串的时候,要引入头文件,但是,如果你引用了有毒的头文件,将导致,你可以正常地使用用string变量,但你却无法cout一个string,如下图所示:什么,你这C++是在逗我,你cout(但不要试图直接包含)就可使用std::string类,然而,问题在于与之相关的operator头文件,你必须手动地将之包含。也就是在说,stri原创 2017-01-20 11:06:09 · 5149 阅读 · 2 评论 -
【OpenMP】并行的中断,解决error C3010: “break”: 不允许跳出 OpenMP 结构化块
虽然我在《【OpenMP】Helloworld》(点击打开链接)与《【OpenMP】互斥》(点击打开链接)都提到过,OpenMP可以与多线程同样理解,但同时也提到过,两者的本质是不同的。最明显的区别,OpenMP是预分配任务的,每个CPU核算多少东西要事先平分,而多线程则在分时片之间存在竞争。最能说明的例子是,如果你的OpenMP出现如下的程序段:#pragma omp parallel原创 2016-05-13 16:14:00 · 7718 阅读 · 0 评论 -
【C++】int与string的互转
不像php、python直接就没有类型概念,一个$可以代替,也不像java、C#能够直接用parseInt等完事,C++要完成int与string的互转,需要用到stringstream。注意,这里的string并不是C++的标准类型,需要在开头#include "string"才能使用。具体转化方式如下:#include "iostream"#include "string"#inc原创 2016-05-13 10:02:25 · 1550 阅读 · 0 评论 -
【C++】Split
如果要将类似“aa ss ff”的字符串按空格分割成一个个字符,Java、C#、PHP或者python等其它语言写多的人,就会认为split一个理应存在的方法, 实际上C++中并没有这个方法,需要我们自己去写。毕竟,C++是一个用字符串,都要引用string头文件的语言!下面提供一个自己写的C++的Split函数:vector split(string str,string separat原创 2016-05-11 16:11:11 · 7601 阅读 · 1 评论 -
【C++】低版本VS程序使用高版本打开的问题
按理来说,低版本VS写作的程序,直接打开解决方案下的Debug文件夹,就能够直接运行,但是一些低版本VS程序,由于VC++的运行库不同,在打开的时候会出现:“应用程序无法启动,因为应用程序并行配置不正确,有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe”的提示信息,如下图所示:这时,需要打开解决方案下而非debug文件夹下的.sln文件,重新编译一下:原创 2016-02-24 15:18:34 · 6944 阅读 · 0 评论 -
【C++】Windows线程的创建、执行、互斥、同步、销毁
虽然同为C语言,但是在不同操作系统下对线程操作的语句还是差异很大的。这主要是操作系统的不同而引起的不同。对比与Linux下纯C环境下,《【Linux】线程互斥》(点击打开链接),Windows如果仅在纯C环境下对线程进行操作,代码实在是太繁琐了。虽然用到C++对Windows线程进行操控代码也简单不了哪去,同样要用一大堆奇奇怪怪的结构体、宏名,但至少代码简便了不少。在同一操作系统,部分对线程的原创 2016-01-12 17:30:15 · 4245 阅读 · 0 评论 -
【C】利用strlen实现endwiths函数
在一些编程语言中,是带有一些很实用的字符串函数的,利用Java中的endwiths,用于判断最后一个字符串是否是某一个字符。然而,C语言没有,我们只好自己去弄。具体代码如下:#include#includeint endwith(char* s,char c){ if(s[strlen(s)-1]==c){ return 1; } else{ return 0; }}原创 2015-12-24 17:08:58 · 3077 阅读 · 0 评论 -
【C++】类的使用
本文不是来长篇大论来步步分析,类的概念。主要是写写C++对类的常见使用方式。纠正几个错误概念。在《【C++】C++的输入输出、循环、条件、字符串、数组、类、继承的使用实例》(点击打开链接),由于不自觉地将Java等其它编程语言对类的经验迁移过来,对类的使用写成如下的形式:#include #include using namespace std;class Student{publ原创 2015-12-30 11:21:28 · 812 阅读 · 0 评论 -
【C++】状态模式
状态模式也是设计模式的一种,这种设计模式思想不复杂,就是实现起来的代码有点复杂。主要出现在类传递参数上,尤其是C++这种不能直接类间互相调用都语言,实现状态模式更难,当然,一切设计模式都是为了更简短的主函数。状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类,主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当原创 2015-10-15 19:24:21 · 4427 阅读 · 1 评论 -
【C++】判断元素是否在vector中,对vector去重,两个vector求交集、并集
C++虽然对vector封装了大量的函数,比如判断元素是否在vector中find、去重的unique,还有在algorithm类中对两个vector求交集、并集的函数,但是,这些函数是不可以直接vector.XX来使用的,如同在《【C++】容器类》(点击打开链接)中提到过如何删除vector的其中元素一样,需要搭上迭代器iterator对其进行遍历才能完成这个动作。这是不同于java与c#的,习原创 2016-05-14 16:07:47 · 39467 阅读 · 2 评论 -
【C++】判断vector是否为另一个vector的子集
C++不像python自带issubset方法,用来判断一个元素是否为另一个元素的子集,需要自己写一个,但是也不能对vector1的一个一个元素判断是否都属于vector2,这个子集最基本的定义去判断,这样做时间复杂度太大了,如果vector1的长度为m,vector2的长度为n,那么时间复杂度将去到O(m*n)之久,元素一多,这很致命,可以用如下的方式去判断vector是否为另一个vector的原创 2016-05-16 10:41:42 · 7650 阅读 · 0 评论 -
【C】指针、引用和数组
在大多数C语言书籍中,指针和引用常常大篇幅介绍,然后一大堆示例程序,让人觉得不明所以。在编程中,自己也不敢乱用,害怕又搞出些野指针,空指针什么的。其实这部分,现在看来并不需要了解这么多东西。只要记住,C语言中,有一个可以存地址的变量类型,比如int *,就是存int地址的变量。至于引用&,一般很少用作变量类型的。&主要和*一样作为运算符的存在比较多。虽然术语不规范,但完全可以将&理解为取地址的运算原创 2016-12-23 16:14:31 · 940 阅读 · 0 评论 -
【C】error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
在纯C环境下写程序,分分钟让你怀疑,自己到底会不会写程序的,太多常用库和类都不能用,甚至一些惯有的“随意表达”,分分钟都是错的。我只想在VS写个纯C练练手,应该说是在.cpp写完,觉得这段代码还可以,符合标准纯C环境,改成.c看看是否能运行,万万没想到的是,这段这么简单的代码,连个刚学C语言,甚至是文科专业选修C语言的童鞋都看得懂得的代码:#includevoid main(){ in原创 2016-12-23 11:55:44 · 92069 阅读 · 16 评论 -
【C】结构体中包含函数
在《【C】Malloc与结构体,其实就是C语言里面的new和类》(点击打开链接)提到,C语言结构体里面也可以包含函数,如同类中有方法一样,但是不能通过直接放过一个函数进去,需要通过函数指针的方式,同时,关于类的构造函数与析构函数C语言表示是没有的,需要你自己手动解决这些问题。下面讲讲如何在C语言中的结构体包含函数。如下的一段代码:#include#includeusing name原创 2016-12-22 17:21:37 · 23355 阅读 · 4 评论 -
【C】Malloc与结构体,其实就是C语言里面的new和类
在本科以来,由于老师和自己的种种原因,我一直不知道结构体和Malloc是什么,每当考试的时候,尤其是数据结构和操作系统考试的时候,我就会对着诸如《【C】利用单链表数据结构实现通讯录,链表的增删改查》(点击打开链接)代码背啊背,然后考试默啊默,一直对于这复杂的结构体和malloc不明所以。学C语言的时候,老师说结构体不用看了,考试重点考到指针和数组,学数据结构的时候,老师会上机,我从课本会抄就行了。原创 2016-12-22 16:35:22 · 8202 阅读 · 2 评论 -
【OpenMP】互斥
既然OpenMP涉及并行编程,那么必然涉及到互斥的问题。也就是对同一个变量操作的问题。还是拿《【Java】线程并发、互斥与同步》(点击打开链接)这个抢票的程序作为例子。定义cpu的4个核都对ticket这个变量进行自减,初始为20的ticket变量去到0程序立即停止,不可以出现ticket在同一时间被减2次,导致ticket变成负数的情况。具体程序如下:#include #include原创 2016-05-09 17:10:28 · 1326 阅读 · 0 评论 -
【OpenMP】Helloworld
对比与Python多线程无法操作多核,Java的多线程只会一味的占用所有核数计算。C/C++在Visual Studio 2005推出OpenMP的支持的,更能够精准地控制用多少核数去运算,而且写法简单,做到真正地多核多线程编程。比起Python、Java多线程无法实质上提升程序速度,C/C++的OpenMP是从CPU核数入手,提升程序速度。众所周知,现在双核、i3、i5、i7都是多个cpu并行的原创 2016-05-09 11:50:16 · 3647 阅读 · 0 评论 -
【C++】VS2010生成的程序在安装了vc2010运行库的机器上提示“丢失MSVCR100D.dll”
理论上,如果一台电脑无须安装多大2.5G的VS2010,只要安装了vc2010运行库,也就是安装了vcredist2010_x86.exe和对应的Framework运行库,那么只是你将解决方案所在的文件夹中的Debug文件夹扔到这台机器上,直接双击里面的exe文件就可以运行了。一般情况下,由于用户会在机器上安装软件或者游戏,一般都会不知不觉装好vcredist2010_x86.exe和对应的Fra原创 2016-05-05 21:31:07 · 25302 阅读 · 4 评论 -
【C++】VS2010将写好的程序打包成安装文件发布
我们可以将自己写好的VS2010程序打包成安装文件,给用户安装,具体步骤如下:1、如下图,同样是新建一个项目,但是这次是新建一个其它项目类型,关于安装和部署,Visual Studio Installer中的安装向导。之后,创建完成之后,弹出的向导,没什么特殊情况,可以直接下一步到完成。2、在应用程序文件夹中,添加已经写好的解决方案所在的文件夹中的Debug文件夹中的所有文件,如果原创 2016-05-05 21:17:47 · 35345 阅读 · 2 评论 -
【C++】观察者模式
观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。举个例子来说明,命令两个人盯着一支蜡烛,蜡烛一熄灭,两个人都能够马上知道。此时蜡烛就是主题,或者叫做通知者,此两人就能够马上得知蜡烛熄灭。对比于,两个人根本就没看蜡烛,蜡烛是否熄灭,要别人通知才知道。常原创 2015-10-13 20:29:39 · 2044 阅读 · 1 评论 -
【C++】原型模式
本文与《【Java】原型模式》(点击打开链接)是姊妹篇,具体的相关概念在这里就不赘述了。主要是想说明如何利用C++说明如何实现原型模式。还是同样采用2013年上半年软件设计师的最后一题作为例子来说明这个问题。唯一的不同,是选用其C++来实现。题目还是这样一字没变:现要求实现一个能够自动生成求职简历的程序。简历的基本内容包括求职者的姓名、性别、年龄以及工作经历等。希望每份简历的工原创 2015-10-12 12:31:14 · 793 阅读 · 1 评论 -
【C++】装饰器模式
装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰器模式刚开始看非常难看懂。其实可以想象这种模式如同数据结构的链表,也可以想象成贪吃蛇。一个类被不停地装饰,相当于在其尾不停地添加结点,最后在读取这个类的时候,犹如读取链表,由于next指针的存在,将原创 2015-10-12 21:54:29 · 4922 阅读 · 5 评论 -
【C++】利用Visual Studio 2008编写C++,Visual Studio 2008的基本使用
现在很多高校还是利用Visual C++ 6.0这一经典版本在教C++,很多人对自己第一个程序的回忆是利用Visual C++ 6.0用C语言写的Helloworld,之后再学习C++的类,不过还是在使用Visual C++ 6.0。于是Visual Studio对Visual C++ 6.0界面的布置改动得比较大,有大部分人如果要写C/C++还是会使用Visual C++ 6.0,甚至苦苦寻找w原创 2015-07-20 15:36:00 · 15336 阅读 · 1 评论 -
【C++】运算符重载
这是C++的特色,也是C++比较难的一个基本语法,但是,如果你把运算符重载看成一个特殊的类方法,且这个类方法的名称就是运算符,一切就变得简单了。下面用一个简单的程序说明这个问题:声明两个3x3二维矩阵a,b,其实就是Matrix类,里面就用私有的长度为9的一维数组存储数据。只是打印的时候,打成二维数组的样子实现~a或者~b就能直接打印a与b,也就是~相当于把a,b打印出来,此乃单目运算原创 2015-07-20 19:51:02 · 867 阅读 · 1 评论 -
【C++】C++的输入输出、循环、条件、字符串、数组、类、继承的使用实例
本文介绍C++的基本使用,用一个程序说明的基本运用,当然C++中的指针与运算符的重载这些特色东西还没有涉及,只是把编程中最基本的东西讲述一次,与《【Python】Windows版本的Python开发环境的配置,Helloworld,Python中文问题,输入输出、条件、循环、数组、类》(点击打开链接)是姊妹篇,据说这堆东西出书的话能写很多很多页,上课的话能上大半学期,真是醉了。以下程序代码原创 2015-07-20 16:34:37 · 1643 阅读 · 1 评论 -
【C】辗转相除法求两个数的最大公约数,利用位运算交换两个数无须中间变量
辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至3000年前。这种算法,在中国则可以追溯至东汉出现的《九章算术》。设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q.原创 2015-07-29 17:17:33 · 1611 阅读 · 0 评论 -
【C】将m~n之间的素数输出与VS2005以上版本对C语言的scanf的警告warning C4996
素数也叫质数,就是在大于1的自然数中,除了1和此整数自身外,不能被其他不包括0的自然数所整除的数,需要注意的是,判断一个自然数n是否为质数,无须从1-n检验是否都能与此数整数,只需要用少于等于根号n的所有素数与此数试除即可,这样,每个数的检验的时间复杂度,足足减少了一半。C语言的实现代码如下:#include#includevoid main(){ int m,n; print原创 2015-07-29 16:46:52 · 2810 阅读 · 0 评论 -
【C++】求数组中所有元素的排列或组合
基本目标是这样的,比如有如下的数组{0,1,2,3,7,8,12,40,51}需要求出其所有排列与组合,需要求出其所有组合,做出如上的结果,也就是随便在数组中挑两个数组成一个对子。代码如下,这里需要用到一个两组循环:void Combination(int* arr,int arr_length){ for(int i=0;i<arr_length-1;i++){ for原创 2015-07-29 10:44:12 · 7864 阅读 · 1 评论 -
【C++】求当前exe的运行路径
在C++中要求出当前exe的运行路径,只需要把主函数写成以下的样子,而不是int main()就可以了:#includeusing namespace std;int main(int argc,char *argv[]){ cout<<*argv; //此处就可以显示文件路径了,文件路径存放在argv[]这个数组里面 return 0;}唯一值得注意的是int argc虽然这原创 2015-07-29 10:49:54 · 1957 阅读 · 1 评论 -
【C】文件读写问题
C语言对文件操作的部分有可能被考到,虽然比较冷门,但是还是有了解的必要的。题目是这样的:有两个磁盘文件“c:\A.txt"与“c:\B.txt",各存放一行字母,要求把两个文件的信息合并,并且按字母顺序排列,输出到c:\C.txt中。比如:在C盘中有:“c:\A.txt"中有字母如下:“c:\B.txt"中有字母如下:程序运行完之后,在C盘会多出一个原创 2015-08-09 18:00:12 · 1836 阅读 · 0 评论 -
【C++】文件的读取与写入
C++的文件读取与写入感觉比起其它语言特别地难,对比起《【Python】文件读写操作》(点击打开链接)、《【php】让记事本成为你调控变量的控制台》(点击打开链接)与《【Java】输入与输出与JDK1.5之后的新型字符串StringBuilder》(点击打开链接),C++最大的特点就是文件的输入流与输出流分开,同时最关键的是自身并没有字符串变量,在其文件的读取方法变量限制于字符数组char[],需原创 2015-07-21 11:08:09 · 6502 阅读 · 6 评论 -
【C++】容器类
C++中的容器类对比起其它语言,无论是《【Python】容器类》(点击打开链接),还是《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)的容器类都没有C++中的容器复杂。且不说C++像Java一样,不能如同Python与php的数组,天生就是可变,不定长,越界就出现问题。C++中的容器,虽然与Java一样同样有List与Map,但是,其提供的封装方法原创 2015-07-21 20:34:08 · 3101 阅读 · 0 评论 -
【C++】对cin输入字符的判断与分段函数的处理
这两个本来也不是什么问题,然而真正遇到还是有地方可以研究的。首先是C++对于cin输入的判断,有时候你定义了一个整形,然后就是有些人就喜欢给你乱输个字符串进去,你必须处理一下,这里不像Java用抛出异常处理用户输入,也不像JavaScript用isNaN来判断,具体见《【JavaScript】对数的判断与对数的处理》(点击打开链接),而是用cin.fail()来判断。至于分段函数的处理,比如要原创 2015-10-21 20:31:31 · 2199 阅读 · 2 评论 -
【C】分治算法
分治算法虽然听起来有可能有点陌生,但是实质上绝对是见过。比如在有序顺序表中的二分查找就是分治法的其中一个实例。它的时间复杂度经常性能把一个问题从O(n)降为O(nlogn),虽然它的代码往往涉及到递归调用,看起来非常复杂。比如以下的一个简单得不能再简单的问题,求数组int a[4]={1,3,2,4}的最大值。第一反应想都不用想就得出如下的代码:#includevoid main(){原创 2015-10-20 20:27:50 · 6195 阅读 · 2 评论 -
【C】贪心算法
所谓的“贪心算法”,就是每一次面临选择时,选择最优、最先、最X的一项,反正就是突出一个“最”字。比如有1,4,3,2,让你选两个数,令选出来的数最大,你肯定按照每次选择都选择,剩余数中最大的一个数,第一次选择4,剩下还有1,3,2,这时傻子都会选择3啊,从而得出在1,4,3,2这四个数中,选出的两数和是最大的。此时,你就不知不觉地运用到了贪心算法,以最大选择为贪心。那么,“贪心算法”真正用到编原创 2015-10-19 22:58:58 · 24045 阅读 · 5 评论 -
【C】VC6调试器的使用
很多人在写C语言的时候不会使用VC6的调试器,想看一个值的时候,往往直接用coutVC6的话,要设置断点,鼠标双击行号是没什么用的。你需要将光标移到你要调试的行,之后按F9。代码所在的行号,前面就会出现一个红色的点,如下图所示。这个但如果你要消掉,也就是消除断点,同样在所在行号,点F9,这也就是为何有同学不好按出红点,然后鼠标疯狂地单击却消不掉的缘故。之后,不要点上面表示运行的感叹原创 2015-10-19 23:26:08 · 5038 阅读 · 1 评论 -
【C】使用指针对数组中的元素换位问题
首先一条比较简单的问题:输入10个整数,将其中最小的数字与第一个数字对换,把最大的数与最后一个数对换。编写3个函数:(1)输入10个数字(2)进行处理(3)输出10个数字思想如下图,使用一个长度为11的数组的第1~10位置存储这10个数,这样既符合人的思维又利用a[0]作为数据交换时候的临时存储空间,代码如下,实现起来非常简单,主要是注意,C语言的指针是如何操作的,包括声明原创 2015-08-06 20:27:40 · 6946 阅读 · 1 评论 -
【C】队列报数问题
题目要求是这样的:有n个人围成一圈,顺序排好,从第1个人开始报数,从1到3报数,凡是报到3的人退出圈子,之后的报数的人从1开始重新报数,问此圈子最后剩下的是原来第几号的那个人。此题必须分为两种情况考虑,就是报数的时候,队列中的人数大于2的情况与等于2的情况,当然队列人数为1的时候那个人就是答案了。之所以分两种情况来操作,是因为报数逢3一次循环,队列中的人数大于2,遍历数组的迭代器会可以继续向后原创 2015-08-06 16:46:35 · 6210 阅读 · 3 评论 -
【C】求函数的定积分
题目要求是这样的:编写一个用矩形法求定积分的通用函数,求的定积分,上下限b,a由用户自行输入。其中sin函数可以利用math.h。这题的代码不难,关键是求解的数学思想而并非编程技巧,所谓的“矩形法”求定积分,就是利用定积分的最基本定义。如下图,在中,相当于把[a,b]中f(x)与x轴所围成阴影范围切割成n份,当n趋向于无穷的时候,分割出来的形状近似与矩形,n个矩形的面积之和接近于阴影部原创 2015-08-06 15:40:44 · 12818 阅读 · 1 评论 -
【C】字符串的输入,求输入字符串中最长的单词
首先,基本目标很简单,就是利用C语言:编写一个函数,输入一行字符,将此行字符中的最长的单词输出。代码如下:#includevoid input(char s[]){ int i=0; for(int c;(c=getchar())!='\n';i++){ s[i]=c; } s[i]='\0';//读取完成,记得对这个字符数组封口}char* findmax(char s原创 2015-08-05 20:15:08 · 13302 阅读 · 4 评论