C++笔记
文章平均质量分 81
HelloZEX
[2018·10·18]所谓核心竞争力,永远是自身的实力!
[2022·4·4]我需要换一个大脑!
展开
-
【C语言】进制输出加上前缀
对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。 对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。 对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。区分不同进制数字...原创 2019-09-25 23:22:09 · 3459 阅读 · 0 评论 -
【C++】多线程编程入门示例 2
多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平。其实C++语言本身并没有提供多线程机制(当然目前C++ 11新特性中,已经可以使用std::thread来创建线程了,因为还没有系统地了解过,所以这里不提了。),但Windows系统为我们提供了相关API,我们可以使用他们来进行多线程编程。创建线程的API函...原创 2018-11-15 10:31:09 · 442 阅读 · 0 评论 -
【C++】多线程编程入门示例 1
①程序,进程,线程的区别程序:程序是由一系列的指令和逻辑组成的一个静态文件(如cpp文件),无论能不能运行,它都客观的存在于储存器中。进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位--来源于百度百科。如果你是初学者,可能你并不能真正地理解这句话。通俗地说,系统为特定的静态程序分配好运行时需要的各种资源,这个时候系统会连带地生成一个PCB(进程控...原创 2018-11-14 21:06:51 · 791 阅读 · 0 评论 -
【C++】const详解
常量概念是为了使程序员能够在变和不变之间画一条界限。给C++程序设计项目中提供了安全性和可控性。——《C++编程思想》在编程中要尽可能多的使用const,这样可以获得编译器的帮助,以便写出健壮性的代码。 define宏定义,可以将常量赋值给一个变量,但由于在编译过程中只是简单的进行文本替换,并不会对赋值语句进行检查,因此会存在很多潜在的威胁,一旦定义出错,整个调用过程也讲出错。所以C+...原创 2018-11-08 17:18:20 · 1315 阅读 · 0 评论 -
【C++】命名空间 namespace
本讲基本要求 * 掌握:命名空间的作用及定义;如何使用命名空间。 * 了解:使用早期的函数库 重点、难点 ◆命名空间的作用及定义;如何使用命名空间。 在学习本书前面各章时,读者已经多次看到在程序中用了以下语句:using namespace std;这就是使用了命名空间std。在本讲中将对它作较详细的介绍。一、 为什么需要命名空间 ...转载 2018-11-05 10:24:41 · 1131 阅读 · 0 评论 -
【C++】volatile关键字
我们都知道当使用编译器时候,编译器会为我们的代码做出一些优化。关于validate关键字的功能和原理我们将用一个例子来给出解释。功能:当一个变量被volidate关键字修饰时,意味着当我们每次使用这个变量时都会从变量所在的内存中去获取。而不使用编译器为我们优化后保存在cpu寄存器中的备份。接下来举个例子给大家说明下。例子:假设在某一个线程中有如下的程序代码, ...int a =...转载 2018-11-07 10:42:50 · 1216 阅读 · 1 评论 -
【C++】枚举类型 enum
一、枚举类型的定义enum 类型名 {枚举值表};类型名是变量名,指定枚举类型的名称。枚举值表也叫枚举元素列表,列出定义的枚举类型的所有可用值,各个值之间用“,”分开。例: enum Suit { Diamonds, Hearts, Clubs, Spades }; 二、枚举变量说明枚举变量有多种声明方式:1.枚举类型定义与变量声明分开如:enum Suit...转载 2018-11-07 10:04:06 · 1321 阅读 · 0 评论 -
【C++】随机数rand( ) 和 随机数引擎
rand()基本:使用随机数时,经常见到的是C标准库提供的函数rand(),这个函数会生成一个0到RAND_MAX(32767)之间的一个整形数; 分布:为了得到一个给定范围内的随机数,通常会对生成的随机数取余:rand()%n,rand()%(n-m)+m; 种子:通过srand()设置随机数种子,种子不变的情况下,每次程序运行,调用rand(),都会生成相同的随机数序列; 浮点:使用...原创 2018-11-02 09:50:49 · 1339 阅读 · 0 评论 -
【C++】异常处理
一、什么是异常处理 一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测出发生了运行时错误,但一般不知道怎样去处理它们(因为和用户具体的应用有关);另一方面,库的用户知道怎样处理这些错误,但却...原创 2018-11-03 10:04:05 · 667 阅读 · 0 评论 -
【C++】regex 正则表达式
正则表达式是一种描述字符序列的方法,是C++11标准库中新加入的强大工具。正则表达式是一种用于字符串处理的微型语言,适用于一些与字符串相关的操作。C++11包含了对以下几种语法的支持:ECMAScript、basic、extended、awk、grep和egrep。C++11中使用的默认语法是ECMAScript。 RE库定义在头文件regex中,它包含多个组件:匹配...原创 2018-11-01 10:39:49 · 2370 阅读 · 1 评论 -
【C++】bitset 二进制位的有序集
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。构造函数bitset常用构造函数有四种,如下:bitset<4> bitset1; //无参构造,长度为4,默认每一位为0bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充string s ...原创 2018-11-01 09:59:45 · 442 阅读 · 0 评论 -
【C++】tuple 元祖
tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值;tuple容器, 可以使用直接初始化, 和"make_tuple()"初始化, 访问元素使用"get<>()"方法, 注意get里面的位置信息, 必须是常量表达式(const expression);可以通过"std::tup...原创 2018-11-01 09:45:29 · 1185 阅读 · 0 评论 -
【C++】Python调用C/C++互相调用(转)
参考源:Python调用C/C++互相调用C/C++与python互相调用201810251.pytest.py#test function def add(a,b): print " in python function add" print "a = " + str(a) print "b = " + str(b) pr...原创 2018-10-25 21:41:39 · 659 阅读 · 0 评论 -
【C++】 Debug 版的 C/C++ Python 扩展模块链接错误:Error LNK1104 cannot open file 'python27_d.lib
Debug 版的 C/C++ Python 扩展模块链接错误:Error LNK1104 cannot open file 'python27_d.lib'环境配置(1)python的lib 以及头文件分别加到vc的include/lib directories中去。(2)写完编译后出现找不到python33_d.lib 错误,出现这个错误的原因是:python_d.lib是 库的调试...原创 2018-10-25 21:40:13 · 2264 阅读 · 0 评论 -
【OpenCV】噪声的添加和过滤
1. 简介下面简单介绍两种图像噪声,即椒盐噪声和高斯噪声。(1) 椒盐噪声 椒盐噪声也称脉冲噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。 图像模拟添加椒盐噪声是通过:随机获取像素点,并设置为高亮度点和低亮度点来实现的。(2) 高斯噪声 高斯噪声是指概率密度函数服从高斯分布的一类噪声。 特别的,如果一个噪声,它的幅度分布服...转载 2018-11-21 16:26:08 · 2663 阅读 · 0 评论 -
【C++】获取某一文件下所有的文件名(地址)
#include <iostream>#include <fstream>#include <istream>#include <ostream>#include <string>#include <vector>#include <cmath>#include <windows.h&a原创 2019-03-12 10:36:21 · 657 阅读 · 0 评论 -
【C++】Lambda表达式
C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。声明Lambda表达式Lambda表达式...转载 2019-04-29 15:53:09 · 462 阅读 · 0 评论 -
【C++】变量的存储位置
1、首先,讲下 “堆 heap” 和 “栈 stack” 的区别: 一个由 c/c++编译过的程序占用的内存分为一下几个部分 (1)、栈区 stack :由编译器自动分配释放,存放函数的参数值,局部变量的值等。这个栈的操作方式类似于数据结构中的栈。 (2)、堆区 heap :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,注意它与数据结构中的堆是两回事...原创 2019-05-07 10:20:29 · 5256 阅读 · 0 评论 -
【C++】运算符重载 三 (总结)
前接文章:【C++】运算符重载 一【C++】运算符重载 二 (实例)c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁、高效。在c++中不止函数可以重载,运算符也可以重载。由于一般数据类型间的运算符没有重载的必要,所以运算符重载主要是面向对象之间的。1.一般运算符重载在进行对象之间的运算时,程序会调用与运算符相对应的函数进行...原创 2019-04-30 18:17:43 · 364 阅读 · 0 评论 -
【C++】运算符重载 二 (实例)
前接文章:【C++】运算符重载 一值得注意的是:1、运算重载符不可以改变语法结构。 2、运算重载符不可以改变操作数的个数。 3、运算重载符不可以改变优先级。 4、运算重载符不可以改变结合性。 类重载、覆盖、重定义之间的区别:重载指的是函数具有的不同的参数列表,而函数名相同的函数。重载要求参数列表必须不同,比如参数的类型不同、参数的个数不同、参数的顺序不同。如果仅仅是函数的返...原创 2019-04-30 17:15:11 · 438 阅读 · 0 评论 -
【C++】运算符重载 一
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。您可以重定义或重...原创 2019-04-30 17:06:02 · 414 阅读 · 0 评论 -
【C++ 并发与多线程】std::thread类-保护数据加锁
在应届生面试的时候,很多面试官都会问——“多线程如何共享资源”。在操作系统层面上可以给出若干关键词答案,但是在语言层面,这个问题考虑的就没有那么简单了。同时,很多人会将多线程数据共享和线程同步混淆。有关线程同步,我们会在接下来的章节里着重阐述。本文主要聚焦于保护共享数据,首先从加锁入手,进而扩展到加锁无法解决的问题,最后会给出一些其他保护方案。参数入栈一个存放参数的栈数据结构,相同函数...原创 2019-04-30 16:16:17 · 3298 阅读 · 0 评论 -
【C++ 并发与多线程】1 std::thread id join
类thread表示单个执行线程。线程允许多个函数并发执行。紧接着关联的线程对象构造,线程开始执行(为任何 OS 调度延迟悬挂),始于作为构造函数参数提供的顶层函数。忽略顶层函数的返回值,而且若它以抛异常终止,则调用std::terminate。顶层函数可以通过std::promise或修改共享变量(这可能要求同步,见std::mutex与std::atomic)交流其返回值或...原创 2019-05-06 09:48:50 · 834 阅读 · 0 评论 -
【C++ 并发与多线程】std::thread类-多线程传参
线程传参正常的线程传参是很简单的,但是需要记住下面一点:默认情况下,即使我们线程函数的参数是引用类型,参数会先被拷贝到线程空间,然后被线程执行体访问。上面的线程空间为线程能够访问的内部内存。我们来看下面的例子:void f(int i,std::string const& s);std::thread t(f,3,”hello”);即使f的第二个参数是引用类型,字符串字面值...原创 2019-04-29 17:05:46 · 4591 阅读 · 2 评论 -
【C++ 并发与多线程】std::thread类-多线程的基本用法
什么叫并发 concurrency?一遍走路一边说话;你打球我游泳单核计算机上的并发是个假象,其实只是任务切换(task switching)需要上下文切换多处理器或一个处理器上有多个核上的并发才是自然的并发,叫硬件并发并发种类:1,多进程并发这些进程间可通过正常的进程通信渠道(信号,套接字,文件,管道等)缺点:1;通信建立较复杂或者慢;2;操作系统需要花时间启动进...原创 2019-04-29 16:48:56 · 4872 阅读 · 0 评论 -
【C++ 并发与多线程】std::thread类-为共享数据加锁 3
如果某个想法是你唯一的想法,再也没有比这个更危险的事情了。本节会阐述保护共享数据的替代方案,很多情况下,使用互斥量并不合适,会带来性能消耗。下文会详细讲解集中通用的场景。保护共享数据的初始化过程为了防止共享数据初始化时数据被破坏,C++提供了std::once_flag和std::call_once来保证共享数据初始化的正确性。// using mutexstd::shar...原创 2019-05-05 10:03:47 · 1037 阅读 · 0 评论 -
【C++ 并发与多线程】std::thread类-为共享数据加锁 2
正交——消除无关事务之间的影响,力求高内聚低耦合。死锁的概念略去不说,死锁有可能发生在使用多个互斥量的场景下,也可能存在没有使用互斥量的场景:两个线程都在等待对方释放互斥量 两个线程都调用了对方的join()函数为了解决两个线程都在等待对方释放互斥量导致的死锁问题,C++11提供了若干机制:std::lock()函数 std::unique_lock类 锁住所有互斥量...原创 2019-05-05 09:59:34 · 868 阅读 · 0 评论 -
【C++ 并发与多线程】std::thread类-为共享数据加锁 1
让复用变得容易,拒绝重复。上一节说到,std::mutex并不能完全解决保护数据的问题。存在好几种情况,即使我们已经使用了互斥量,数据还是被破坏了。将被保护数据暴露到互斥量作用域之外 被保护数据的访问接口本身就存在竞态条件(条件竞争)不要暴露你的数据来看下面例子:struct protected_data{ char data[100];}class ...原创 2019-05-05 09:35:59 · 958 阅读 · 0 评论 -
【C++】error LNK2019: 无法解析的外部符号
转:C++ error LNK2019: 无法解析的外部符号 错误解决方案今天在实现类模板特例化的时候遇到一个问题,就是把类模板函数实现放到类的cpp文件中,然后在main函数中使用这个类的时候,就会出现无法解析的外部符号:函数名(xxxx)等错误,那么出现这个错误的原因是什么呢?原因就是现在的编译里不支持模板函数的申明和实现分开,要像上面那样使用类成员函数,有以下两种方法1. 在使用...转载 2018-10-25 21:34:45 · 1786 阅读 · 0 评论 -
【C++11】Lambda表达式
C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。声明Lambda表达式Lambda表达式...转载 2018-10-25 10:48:48 · 289 阅读 · 0 评论 -
【C++笔记】《Effective C++》笔记
《Effective C++ 改善程序与设计的55个具体做法》笔记一、让自己习惯C++ 条款01:视C++为一个语言联邦1. C++由四个次语言组成:2. C语言3. Object-Oriented C++ 面向对象C++4. Template C++ 模板C++ C++的泛型编程部分5. STL 标准模板库 C++高效编程守则视状况而变化,取决于你使用C+...原创 2018-06-28 11:26:20 · 247 阅读 · 0 评论 -
【C++笔记】《C++编程思想-卷二》笔记
《C++编程思想》笔记 Volume 2 第一章 异常处理增强错误恢复能力是提高代码健壮性的最有力的途径之一。将try块嵌套在for、while、do或者 if快中,并且触发异常来试图解决问题,然后重新测试try块中的代码。1.5 清理(1).资源管理异常处理的魅力之一在于程序能够从正常的处理流程中跳转到恰当的异常处理器中。如果异常抛出时,程序不能做恰当的清理工作,那么异常本身并没有什么用处。编写...原创 2018-06-28 11:25:19 · 480 阅读 · 0 评论 -
【C++笔记】《C++编程思想-卷一》笔记
《C++编程思想》笔记 Volume 1 第一章 对象导言OOP ObjectOriented Programming 面对对象编程UML Unified Model Language 统一建模语言 堆(stack)和栈(heap)预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,...原创 2018-06-28 11:23:28 · 826 阅读 · 0 评论 -
【C++笔记】C++11常用特性的使用经验总结
转载:https://www.cnblogs.com/feng-sc/p/5710724.html#title12转载 2018-07-02 15:54:17 · 259 阅读 · 0 评论 -
【C++笔记】进程和线程
1、什么是线程?线程是指程序在执行过程中,能够执行程序代码的一个执行单元,在Java语言中,线程有四种状态:运行,就绪,挂起,结束。2、线程与进程的区别?进程是一段正在运行的程序,而线程有时也被称为轻量级进程,它是进程的执行单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间,但是,各个线程拥有自己的栈空间。3、为什么使用多线程?(1)、使用多线程可以减少程序的响应时间。单线程如果遇到等...原创 2018-07-02 15:49:17 · 179 阅读 · 0 评论 -
【C++笔记】C语言include引用顺序tip
在C语言中,我们常用include去引用一个头文件。比如:#include<stdio.h>。平时我们编程时很少关心头文件的引用顺序。其实,头文件的引用顺序对于程序的编译还是有一定影响的。此处记录一个小常识,以加强对该知识点的记忆。1.如果要在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量...转载 2018-07-02 15:41:23 · 1202 阅读 · 0 评论 -
【C++笔记】C/C++程序从编译到最终生成可执行文件的过程分析
一.四个步骤 对于C/C++编写的程序,从源代码到可执行文件,一般经过下面四个步骤:1).预处理,产生.ii文件2).编译,产生汇编文件(.s文件)3).汇编,产生目标文件(.o或.obj文件)4).链接,产生可执行文件(.out或.exe文件) 以hello.c为例,这个过程可以用下面的图来表示二.预处理 预处理主要包含下面的内容:a.对所有的“#define”进行宏展...转载 2018-07-02 15:31:13 · 545 阅读 · 0 评论 -
【C++笔记】数据结构栈、堆,内存占用中栈区、堆区的区别和理解
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教...转载 2018-06-27 10:43:35 · 557 阅读 · 0 评论 -
【C++笔记】NULL、0、nullptr区别分析
一、C的NULL在C语言中,我们一般使NULL表示空指针,即:int *i = NULL;foo_t *f = NULL;但是,实际上在C语言中,NULL通常被定义为:#define NULL((void*)0) 也就是说NULL实际上是一个void *的指针,然后吧void *指针赋值给int *和foo_t *的指针的时候,隐式转换成相应的类型。而如果换做一个C++编译器来编译的话是要...原创 2018-06-27 10:03:48 · 235 阅读 · 0 评论 -
【C++笔记】如何判断2个线段相交
判断 2 个线段相交有很多方法,最直接的方法就是直接计算两条直线的交点,然后看看交点是否分别在这两条线段上。这样的方法很容易理解,但是代码实现比较麻烦。还有一种常用的方法是通过向量叉积来判断的,这种方法不需要算出直线方程,在代码实现上比较简便。 用这种方法判别线段是否相交一般分为两步: 1. 快速排斥实验 2. 跨立实验快速排斥实验我们首先判断两条线段在 x 以及 y 坐标的投影是否有重合。 也就...转载 2018-07-02 09:44:25 · 17448 阅读 · 9 评论