c/c++
文章平均质量分 73
___Blue_H
0和1的世界简单一点
展开
-
C++ STL数值算法(头文件numeric内)
accumulate//版本1template <typename InputIterator, typename T>T accumulate(InputIterator first, InputIterator last, T init) { for ( ; first != last; ++first) init = init + *first; return ...原创 2018-04-28 14:55:32 · 4794 阅读 · 2 评论 -
STL容器:优先队列priority_queue
priority_queue顾名思义,是一个具有权值概念的queue,它和queue一样允许加入新元素、移除旧元素等功能。由于这是一个queue,所以只允许在底部加入元素,从顶部取出元素。但优先队列带有权值概念,其内的元素自动按照元素的权值排序。权值最高者排在最前面。 STL的priority_queue用二叉堆来实现,关于二叉堆的实现以及堆排序在另外的文章:二叉堆、堆...原创 2018-04-24 08:48:41 · 325 阅读 · 0 评论 -
STL容器:deque实现
概述 vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作。vector虽然从技术上也可以实现对头尾两端进行操作,但由于vector的底层实现特点的原因,其头部操作效率奇差,故STL没有为vector实现这一功能。 deque和vector的最大差异,一在于deque允许于常数时间内对头部进行插入和删除操作,二在于deque是动态...原创 2018-04-23 17:38:48 · 894 阅读 · 0 评论 -
模板编程
模板模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或公式,在使用模板时,我们提供足够的信息将模板转换为特定的类或函数。这种转换发生在编译时。函数模板考虑这样一个功能的实现:交换两个静态类型相同的变量的值,编写一个swap函数。void swap(int &a, int &b) { int temp = a; a = b; b = temp;...原创 2018-04-07 00:48:22 · 2222 阅读 · 0 评论 -
SGI STL空间配置器
空间配置器 STL的空间配置器是为整个STL的容器中存放的操作对象(所有的数值)分配空间的一个组件,之所以说是空间配置器而不是内存配置器是因为空间不一定是内存,也可以是硬盘或其他存储介质。本文所介绍的SGI STL提供的配置器配置的对象是内存。 SGI空间配置器——std::alloc 我们熟悉的C++的动态内存分配与释放函数是new和delete,它们配置内...原创 2018-04-10 21:37:08 · 281 阅读 · 0 评论 -
萃取编程技术
萃取编程萃取编程技术是在模板编程的基础上结合模板偏特化和类模板的内嵌类型声明(相关内容链接)得到的一种类型识别(推导)技术(实际上这是模板元编程技术的一个典型应用)。类型萃取的方式类型萃取是在模板的基础上区分内置类型和其他类型,主要原理是将内置类型全部特化,然后再进行区分。《STL源码剖析》样例分析在STL中,迭代器是萃取编程技术的一个重要实现成果。迭代器就像智能指针,解引用、...原创 2018-04-09 10:41:06 · 457 阅读 · 1 评论 -
模板——参数推导与特例化
模板实参推断对于函数模板,编译器利用调用中的函数实参来确定其模板参数。从函数实参来确定模板实参的过程被称为模板实参推断(template argument deduction)。在模板实参推断过程中,编译器使用函数调用中的实参类型来寻找模板实参,用这些模板实参生成的函数版本与给定的函数调用最为匹配。与非模板函数一样,在一次调用中传递给函数模板的实参被用来初始化函数的形参。模板特例化编写...原创 2018-04-09 10:31:48 · 431 阅读 · 0 评论 -
C++容器概述和序列式容器基本操作
容器是一些特定类型对象的集合,容器类分为序列式容器和关联容器两种。容器基本操作 容器类的一些基本操作如下图:定义和初始化 每个容器都定义了一个默认构造函数。除array之外,其他容器的默认构造函数都会创建一个指定类型的空容器,且都可以接受指定容器大小和元素初始值的参数。将一个容器初始化为另一个容器的拷贝 将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器,或者拷贝由一...翻译 2018-02-02 18:40:31 · 3145 阅读 · 0 评论 -
容器适配器
概念 适配器(Adaptors)是标准库中的一个通用概念,容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器(Container adaptors)接受一种已有的容器类型,使其行为看起来像一种不同的类型。标准库定义了三个序列容器适配器:stack、queue和priority_queue。通用操作和类型定义一个适配器...原创 2018-02-18 16:00:11 · 488 阅读 · 0 评论 -
std::vector概述
vector可以理解为动态数组,其特点和基本操作方式与array相似,但vector可以动态调整大小。 vector中的元素是连续存储的,这意味着我们不仅可以通过迭代器std::vector<T>::iterator,还可以像array一样使用下标来访问任意位置的元素。vector支持的基本操作:点击打开链接vector的元素存储机制 我们可...原创 2018-02-17 21:22:25 · 8618 阅读 · 0 评论 -
迭代器概述
基本概念迭代器概念是可用于标识和访问容器元素的一种类型。迭代器按基本用法可分为5种:输入迭代器(InputIterator)、输出迭代器(OutputIterator)、前向迭代器(ForwardIterator)、双向迭代器(BidirectionalIterator)和随机访问迭代器(RandomAccessIterator)。迭代器可以看做是指针的抽象。输入迭代器(InputIterator...原创 2018-02-16 19:39:52 · 527 阅读 · 0 评论 -
位存储模板类:bitset
为了使程序员更好地操作二进制位,C++STL定义了一个操作二进制位集合的模板类:bitset。 不指定初始值时,bitset的所有位都默认初始化为0。我们可以从一个string或一个字符数组指针来初始化bitset。两种情况下,字符都直接表示位模式,即字符串中下标最小的字符表示最高位,反之亦然。如果string包含的字符数比bitset少,则bitset的高位被置为0。bitset<8&g...原创 2018-05-27 17:07:48 · 376 阅读 · 0 评论 -
C++拷贝构造函数
定义拷贝构造函数(copy constructor),又称复制构造函数,是在基于同一个类的其他对象进行构造的时候(赋值初始化、参数传递、返回值)被编译器调用的一种特殊构造函数。假设有一个类类型为T,拷贝构造函数的第一个形参必须是该类类型的引用,(即T&)也可以用cv限定符来修饰(const T&、volatile T&或const volatile T&),也可...原创 2019-08-11 22:19:32 · 1260 阅读 · 0 评论 -
C++默认构造函数
定义默认构造函数是可以无实参调用(空参数列表或所有形参都提供了默认初始值)的构造函数,在没有提供显式初始化值时被调用。假设类类型为T,其默认构造函数声明的语法如下:T();T::T();T() = delete; //C++11T() = default; //C++11T::T() = default; //C++11在上面几种默认构造函数的声明中,2和5都属于类外定义(每...原创 2019-08-06 01:25:33 · 1313 阅读 · 0 评论 -
C++断言
断言简述断言(assertion)是编程中的一种常用手段,在通常情况下,断言就是将一个返回值总是真(或者我们需要是真)的判别式放在语句中,用以排除在设计逻辑上不应该出现的情况。举个例子:我们都知道除数不能为0,那么就可以对除数使用断言,以使程序在除数为0的情况下产生异常退出。通常来说,断言并不是正常程序所必需的,但对于程序调试来说,通常断言能够帮助开发者快速定位那些违反了某些前提条件的程序...原创 2019-03-06 15:24:57 · 12098 阅读 · 0 评论 -
《剑指offer》题解
1.赋值运算符函数CMyString& CMyString::operator=(const CMyString &str){ if (this != &str) { CMyString strTemp(str); char *pTemp = strTemp.m_pData; strTemp.m_pDa...原创 2018-12-25 13:53:47 · 450 阅读 · 0 评论 -
Linux进程的内存空间布局
此文也可看作是Linux下C程序的内存空间布局(虚拟地址),因为在Linux下的C编译器本质上也是一个进程,编译器再强大也得在操作系统的保护模式下运行。内存空间布局 在Linux中,进程的内存空间按低地址到高地址的顺序分为:代码段text、数据段data、bss段、堆、栈和内核数据区(命令行参数和环境变量等)。如下图所示: 从C程序的角度来说,...原创 2018-10-09 11:51:41 · 4964 阅读 · 0 评论 -
Linux C互斥锁和条件变量(POSIX标准)
与进程类似,线程也存在同步的问题,当多个控制线程共享相同的内存时,需要确保每个线程看到一致的数据视图,如果每个线程使用的变量都是其他线程不会读取或修改的(比如线程私有数据),就不会存在一致性问题。通常来说用户可以使用互斥量(互斥锁)或者的条件变量(条件锁)的方式来解决线程的同步问题。互斥锁 互斥锁是一个简单的锁定命令,它可以用来锁定共享资源使得其他线程无法访问。互...原创 2018-08-24 13:26:52 · 12236 阅读 · 6 评论 -
Linux C多线程编程基础
获取线程标识符 每一个线程都有一个在进程中唯一的线程标识符,在Linux中用一个数据类型pthread_t来表示,实际上这个类型是一个机器相关的无符号整型数据。 Linux提供了两个函数用于获取和比较线程标识符。#inlcude <pthread.h>pthread_t pthread_self(void); //返回值是线程自身的线程标...原创 2018-08-23 21:36:26 · 2537 阅读 · 0 评论 -
Linux C多进程编程基础
关于进程概念相关的内容请打开链接,本文所介绍的是进程的POSIX标准。进程的关系 Linux中的所有进程都是相互联系的,进程之间的的从属关系有父/子关系和兄/弟关系。 Linux内核创建了进程标号为0以及进程标号为1的进程。其中PID为1的进程是初始化进程init,Linux中的所有进程都是由其衍生而来的,在shell下执行程序启动的进程则是shell进程的子进...原创 2018-08-20 23:15:51 · 3960 阅读 · 0 评论 -
浮点数初探及C++类型转换规则
浮点数简要介绍:浮点数是C++的第二组基本类型。我们对浮点数最直观的认识就是能表示带小数部分的数字。但浮点数在计算机究竟是如何存储及表示的呢?以十进制数824.33和8.2433为例,这两个数的区别在于小数点的位置。我们都知道,这两个数用科学计数法可以分别表示成8.2433×102和8.2433×101,浮点数为计算机用一个定点数与一个基数(一般为2)的幂的乘积来近似(注意是近似)表示一个实数...原创 2017-04-26 23:05:52 · 1216 阅读 · 0 评论 -
Linux的信号机制
信号机制信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。在头文件<signal.h>中定义了64种信号,这些信号的名字都以SIG开头,且都被定义为正整数,称为信号编号。可以用“kill -l”查看信号的具体名称。上图中编...原创 2018-08-23 13:53:42 · 6759 阅读 · 1 评论 -
Linux C网络编程基础
目录Linux套接字结构定义Linux C的网络基础操作函数字节顺序转换函数族IP地址转换函数族域名转换函数Linux网络套接字操作函数创建套接字描述符函数绑定套接字函数建立连接函数倾听套接字切换函数接收连接函数关闭连接函数套接字读写函数套接字地址获取函数发送和接收函数Linux套接字结构定义Linux在头文件<sys/so...原创 2018-08-12 16:23:09 · 11028 阅读 · 1 评论 -
C++11新特性:参数绑定——std::bind
概述 std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序原创 2018-02-07 23:33:03 · 62517 阅读 · 0 评论 -
C++11新特性:lambda表达式
简介 lambda表达式(lambda expression)基于数学中的λ演算得名。在计算机科学中,我们可以将其理解为一个匿名内联函数,一个lambda表达式表示一个可调用的代码单元。 与任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内部。C++的lambda表达式的基本语法如下: ...原创 2018-02-07 16:59:41 · 649 阅读 · 0 评论 -
size_type
size_type是在STL的string类和vector类中定义的类型,用以保存任意string对象或vector对象的长度,size_type的抽象意义是尺寸单位类型。size_type实质上是无符号整型,但其长度不是固定的,它可以是unsigned int,也可以是unsigned long甚至是unsigned long long。简单来说,size_type足够存放下任何string原创 2017-11-09 23:54:18 · 768 阅读 · 0 评论 -
C++的三个数组模板类
valarrayvalarray类是由头文件valarray支持的。顾名思义,这个类用于处理数值(或具有类似特性的类),它支持诸如将数组中所有元素的值相加以及在数组中找出最大和最小的值等操作。valarray被定义为一个模板类,以便能够处理不同的数据类型。特点及使用方法valarray的接口定义如下:template class valarray{public:原创 2017-07-16 22:07:00 · 841 阅读 · 0 评论 -
C++虚函数与动态联编
静态联编和动态联编 编译器将源代码中的函数调用解释为执行特定的函数代码块,这一行为被称为函数名联编(binding)。联编行为发生在编译过程中则被称为静态联编(static binding),又称为早期联编(early binding)。然而,虚函数使这项工作变得更困难。虚函数的特点使得程序使用哪一个函数是不能再编译时确定的,因为编译器不知道用户将选择哪一种类型的对象。所以,编译器...原创 2017-07-11 19:54:37 · 2579 阅读 · 1 评论 -
枚举
常规枚举定义及特点C++中的枚举是一个被命名的整型常数的集合。枚举在生活中很常见,例如表示星期的Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,就是一个枚举。常规枚举常与switch语句配合使用以优化分支结构的表达。在C++中这样定义:enum Week {Sunday, Monday, Tuesday, Wednesd...原创 2017-06-10 12:03:57 · 331 阅读 · 0 评论 -
C++构造函数与析构函数
构造函数构造函数是一类特殊的类成员函数,在创建类对象的时候被调用。构造函数的名称和类名相同,但通过函数重载,可以创建多个同名的构造函数,条件是每个函数的特征标(参数列表)都不同。另外,构造函数没有声明类型。通常,构造函数用于初始化类对象的成员,初始化应于构造函数的参数列表匹配。引用《C++ Primer Plus(中文版)第6版》第十章中的一个程序#include #includ原创 2017-06-06 22:14:08 · 274 阅读 · 0 评论 -
C++名称空间
在C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员等。关于一般名称的特点,右转博文:引入名称空间之前C++变量和函数的存储方案及特点————————————————————————————————————————————————————————— 传统的名称空间属性声明区域: 声明区域是可以在其中进行声明的区域。例如,外部(全局)...原创 2017-05-31 21:46:11 · 1382 阅读 · 0 评论 -
C++动态内存分配
动态内存分配(Dynamic Memory Allocation)所谓动态内存分配就是在程序执行过程中动态地分配或回收存储空间的内存分配方法。动态内存分配由系统根据程序的需要即时分配内存,与之相对的静态内存分配是编译器在程序执行前为程序中的各种变量分配好存储空间。通常,编译器使用四种独立的内存:一块用于存放代码,一块用于静态变量(可能再细分),一块用于自动变量,另一块用于动态存储。C+原创 2017-05-29 08:43:10 · 505 阅读 · 0 评论 -
引入名称空间之前C++变量和函数的存储方案及特点
变量变量存储方案自动存储持续性静态存储持续性线程存储持续性动态存储持续性作用域链接性单定义规则自动变量寄存器变量静态变量静态外部变量静态内部变量静态局部变量函数语言链接性关键字volatile和mutablevolatilemutable原创 2017-05-16 23:54:34 · 436 阅读 · 0 评论 -
C++函数参数传递的一大利器——引用(左值)
前言:本文只浅显地介绍了三种函数参数传递的方式及其优劣,主要目的是为了介绍引用。在另一篇博文中将会用本文中的主要代码反汇编为汇编代码,从编译器处理函数调用的层面更深入地探讨三种函数参数传递的区别。C++函数参数传递方式:一、按值传递二、按指针传递三、按引用传递引用的定义、特点、优势原创 2017-05-08 22:53:58 · 3090 阅读 · 0 评论 -
从汇编语言进一步了解C++三种函数参数传递方式
前言:本文为另一篇博文中对函数参数传递方式的进一步探讨,部分内容涉及汇编语言,但不影响理解。编译器对函数调用的实现过程:计算机对数据的处理是不断寻址、读写数据的过程。上升到程序层面,一个个函数在汇编语言中就是一段段汇编指令,这些汇编指令让计算机通过寄存器在内存中访问指定内存块地址并从中读写数据。除全局变量和其它一些形式定义的变量外,函数中的变量都存在栈内存中,程序对变量的修改、传递等一系列操作都是寄存器通过将内容或地址进栈、出栈来实现的。原创 2017-05-10 13:17:15 · 1877 阅读 · 1 评论 -
共用体——经常被忽略的实用数据类型
共用体定义:共用体(union)是一种数据格式,它是能够存储不同的数据类型,但只能同时存储其中的一种类型。特点:1.成员共用内存共用体中使用覆盖技术让数据成员之间相互覆盖,以实现不同数据成员共用同一段内存。union demo { int a; long b; double d; }; demo原创 2017-04-30 09:19:36 · 3716 阅读 · 0 评论 -
constexpr和常量表达式
常量表达式常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。const int a = 3;//a是常量表达式const int b = a+1;//b是常量表达式int c = 8;//c不是常量表达式,因为c的数据类型是int而不是const intco原创 2017-11-13 10:59:22 · 2760 阅读 · 0 评论 -
C++运算符
C++的算术运算符有一元正号或加法+、一元负号或减法-、乘法*、除法/、求余%算术运算符中,一元运算符优先级最高,其次是乘法和除法,优先级最低的是加法和减法。C++的算术运算符都满足左结合律,意味着当优先级相同时,按照从左向右的顺序进行组合。算术运算符的运算对象和求值结果都是右值。在表达式求值前,小整数类型的运算对象被提升成较大的整数类型,所有运算对象最终都会转换成同一类型。一元正号运原创 2017-11-16 23:01:53 · 969 阅读 · 0 评论 -
C++的类类型隐式转换与explicit关键字
类类型隐式转换如果构造函数只接受一个实参,则它实际上定义了转换为此类型的隐式转换机制,有时我们把这种构造函数称作转换构造函数(converting constructor)。即,能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则。这种隐式转换仅限于一步转换(即不能连续转换)。class A { public: A (char c) {} A (std::原创 2018-01-30 12:34:56 · 262 阅读 · 0 评论 -
C++11新特性:委托构造函数(delegating constructor)
C++11新标准扩展了构造函数初始值的功能,使得我们可以定义所谓的委托构造函数(delegating constructor)。一个委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程,或者说它把它自己的一些(或者全部)职责委托给了其他构造函数。class Test {private: int i; char c;public: Test(int iv, char cv) :原创 2018-01-29 20:53:30 · 1608 阅读 · 0 评论