![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 64
柚子树cc
但行好事 莫问前程
展开
-
memmove函数的实现
memcpy和memmove在C语言中,对于字符串之间的拷贝经常使用的函数有strcpy, strncpy以及memcpy, memmove这几个,其中str系列只可用于字符串间的拷贝,而mem系列为按字节内存拷贝,可用于任何类型数据间的拷贝。为什么有了memcpy还需要有memmove呢?这是Mac平台下的memmove函数,与其它平台不同,不好直接看到源码:#if __has_builtin(__builtin___memmove_chk) || defined(__GNUC__)#undef m原创 2021-10-31 15:36:27 · 1273 阅读 · 0 评论 -
C++中do...while(false)妙用
C++中do…while(false)妙用C++中,循环逻辑有三种格式:for,while以及do...while();,前两种是比较常用的,循环逻辑也很直观,但是do...while()循环一般比较少见,它其实更多地是用在宏函数定义和代码结构优化中,具体看下面代码:用在宏函数中加入需要定义一个释放内存的宏函数,如下:#define SAFE_DELETE(ptr)原创 2021-08-11 20:41:53 · 1160 阅读 · 1 评论 -
C++中的POD类型
POD类型是英文中Plain Old Data的缩写。POD在C++中是一个非常重要的概念,通常用于说明一个类型的属性,尤其是用户自定义类型的属性。POD属性在C++11中往往又是构建其它C++概念的基础,事实上,在C++11标准中,POD出现的概率相当高。因此学习C++,尤其是在C++11中,了解POD的类型是非常必要的。POD意如其名。Plain,表示了POD类型是个普通的类型,在C++中常见的类型都有这样的属性,而不像一些存在着虚函数虚继承的类型那么特别。而Old类型则体现了其与C的兼容性,比如可以转载 2021-06-27 12:09:40 · 4302 阅读 · 0 评论 -
[C++] 中的trivial destructor
如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。如果某个类中只有基本类型的话是没有必要调用析构函数的,delelte p的时候基本不会产生析构代码,在C++的类中如果只有基本的数据类型,也就不需要写显式的析构函数,即用默认析构函数就够用了,但是如果类中有个指向其他类的指针,并且在构造时候分配转载 2021-03-10 13:06:57 · 1079 阅读 · 0 评论 -
[C++] 打印从1到最大的n位数(string处理最大数)
/*------------------------------------*//** * @file 剑指offer * @brief 输出从1到n的整数 * * @author DuYong * @date 2020-9-19**//*------------------------------------*/#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#incl原创 2020-09-19 14:34:50 · 271 阅读 · 0 评论 -
[C++] 运算符重载总结及复数类实现
C++ 预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的 C++ 多态。目的在于让人能够用同名的函数来完成不同的基本操作。要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:operator p(argument-list)//operator后原创 2020-08-18 14:59:22 · 731 阅读 · 0 评论 -
i++ 和 ++i 哪个效率更高
简单比较前缀运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。首先考虑内建数据类型的情况:如果自增表达式的结果没有被使用,而是仅仅简单地用于增加一元操作数,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异。我们看看下面这个程序:#include <stdio.h>int main(){ int i = 0; int x = 0; i++; ++i; x = i++; x =原创 2020-05-29 19:17:49 · 555 阅读 · 0 评论 -
C++中的 # 和 ##
#:构串操作符构串操作符 # 只能修饰带参数的宏的形参,它将实参的字符序列(而不是实参代表的值)转化为字符串常量执行以下代码#include <stdio.h>#define STRING(s) #s#define TEXT(s) "class"#s"info"int main(){ int integer = 999; printf(STRING(integer)"\n"); printf(TEXT(integer)"\n"); return 0;}输出结果原创 2020-05-29 13:21:57 · 5609 阅读 · 0 评论 -
STL容器 -- list
1、list容器基本概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释...原创 2019-05-07 15:18:03 · 103 阅读 · 0 评论 -
STL容器 -- set/multiset
1、set/multiset容器基本概念(1)set容器set的特性是,所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。set不允许两个元素有相同的键值。我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,s...原创 2019-05-07 15:21:07 · 146 阅读 · 0 评论 -
STL容器 -- map/multimap
1、map/multimap容器基本概念map的特性是,所有元素都会根据元素的键值自动排序。map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那...原创 2019-05-07 15:24:06 · 160 阅读 · 0 评论 -
STL容器 -- string
1、基本概念C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件中。String和c风格字符串对比:Char* 是一个指针,String是一个类string封装了char* ,管理这个字符串,是一个char* 型的容器。String封装了很多实用的成员方法查找find,拷贝copy,删除delete 替换r...原创 2019-05-06 15:07:29 · 177 阅读 · 0 评论 -
STL容器 -- queue
1、queue容器基本概念queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。queue不提供遍历功能,也不提供迭代器。2、queue容器常用API(1)queue构造函数 queu...原创 2019-05-07 15:13:10 · 131 阅读 · 0 评论 -
STL容器 -- stack
1、stack容器基本概念stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素推入栈的操作称为:push,将元素推出stack的操作称为pop。stack所有元素的进出都必...原创 2019-05-07 15:08:47 · 129 阅读 · 0 评论 -
STL容器 -- deque
1、deque容器基本概念vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法接受。deque容器和vector容器最大的差异,一在于deque允许使用常数项时间对头端进行元素的插入和删除操作。二在于deque没有容量的...原创 2019-05-06 17:36:48 · 108 阅读 · 0 评论 -
STL容器 -- vector
1、vector容器基本概念vector的数据安排以及操作方式,与Array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活...原创 2019-05-06 16:56:13 · 119 阅读 · 0 评论 -
STL基础及六大组件
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要应用在 c++中,但是在引入 c++之前该技术已经存在很长时间了。STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函...原创 2019-05-06 14:49:50 · 166 阅读 · 0 评论 -
细胞分裂模拟(C++)
一种细胞在诞生(即上次分裂)后会在 500 ~ 2000 秒内分裂为两个细胞,每个细胞又按照同样的规律继续分裂。下面的程序模拟了细胞分裂的过程,会输出每个细胞的分裂时间。代码如下://========================================== // Filename : 细胞分裂模拟 // Time : 20...原创 2019-05-01 18:20:19 · 2579 阅读 · 0 评论 -
C++静态库和动态库详解(转)
一、什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a,.lib)和动态库(.so,.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:编译过程二、静态库之所以称为静态库...转载 2019-07-13 14:34:52 · 661 阅读 · 0 评论 -
static 关键字
static 的作用:1、static修饰一般变量局部变量在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。内存中的位置:静态存储区初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。注:当static用来修饰局部变量的时候,它...原创 2019-04-11 00:06:31 · 87 阅读 · 0 评论 -
C++中的异常机制详解
这两天在学习 Java,学到 Java 的异常机制时发现有些概念不理解,异常类,捕获异常的执行流程等,于是决定去复习一下 C++ 里面的异常机制,触类旁通吧,有 C++ 的基础学习 Java 语法还是很容易理解的,同样,学习 Java 也会对于 C++ 的面向对象有更深的理解,毕竟 Java 一切皆是类,下面说正题。C++ 中的异常机制,我是翻看了以前的 C++ 学习视频,西北工业大学 – C...原创 2019-06-26 18:24:59 · 890 阅读 · 1 评论 -
C++的标准程序库异常处理
C++标准提供了一组标准异常类,这些类以基类Exception开始,标准程序库抛出的所有异常,都派生与该基类,这些类构成如图所示的异常类的派生继承关系。该继承类提供一个成员函数what(),用于返回错误信息(返回类型为const char*)。在Exception类中,what()函数的声明如下:virtual const char* what() const throw();该函数可以在...转载 2019-06-26 12:51:12 · 912 阅读 · 1 评论 -
C++输入字符串的几种方式
最近有复习到 C++ 基础知识,这里总结下在 C++ 中输入字符串的几种方式,有需要的可以参考:1、cin >>void Cin1() //输入一个数字{ int a, b; cin >> a >> b; cout << "a + b = " << a + b << endl;}运行结果:void ...原创 2019-05-10 10:20:21 · 42225 阅读 · 3 评论 -
C语言实现简单的二叉树
这是用C语言写的一个简单的二叉树,并提供一个递归遍历的接口,有需要的可以参考。代码如下://========================================== // Filename : C语言实现简单的二叉树 // Time : 2019年5月2日 // Authonr : 柚子树 ...原创 2019-05-02 10:54:16 · 911 阅读 · 0 评论 -
C语言实现简单的单链表
这是用C语言实现的一个简单的带头结点的单链表,可以进行基本的遍历、插入、删除以及销毁等操作,有需要的可以参考。代码如下://========================================== // Filename : C语言实现简单的单链表 // Time : 2019年5月2日 // Authon...原创 2019-05-02 02:42:50 · 1730 阅读 · 0 评论 -
const在C与C++中的区别
1、C语言中全局const变量会存储到只读数据段,C++中全局const变量声明为extern或者对变量取地址时,编译器会分配内存,变量存储在只读数据段。两个都受到了只读数据段的保护,不可修改。const int constA = 100;int main(){ int* p = (int*)&(constA); *p = 200; ...原创 2019-04-16 00:04:23 · 585 阅读 · 0 评论 -
C++中的4种类型转换
在 C 语言中,进行类型转换只需要在变量前面加上变量类型,并且转换可以是双向的。例如 int 类型可以转换为 double 类型,double 类型也可以转换为 int 类型。但是这种简单粗暴的方式在 C++ 中是不合适的。第一,无法完成 C++ 中的自定义数据类型类;第二,C 语言可以在任意类型之间转换,比如可以将一个指向 const 型对象的指针转换为指向一个非 const 型对象的指针,这对...原创 2019-04-01 02:24:01 · 6678 阅读 · 0 评论 -
面向对象的设计原则
1、单一职责原则单一职责原则的核心思想是要求一个类只具有一项职责,并且引起这个类发生变化的原因只有一个。 如果一个类承担的责任过多,这些职责之间难免相互关联,高度耦合,这与面向对象高内聚低耦合的原则是相悖的。当类的职责过多,就应该考虑将类拆分,而拆分的原则就是单一职责原则。 使用单一职责原则可以使类变得简单,复杂度更低,并且短小的代码也更容易维护,可读性更高,此外当程序发生变更时,可以将...原创 2019-04-04 00:51:32 · 102 阅读 · 0 评论 -
指针数组和数组指针
1、指针数组定义:int * p[n] = { 0 };[] 的优先级高于 * ,p先与 [] 结合,指明这是一个数组,然后再和 int* 结合,说明数组里的每一个元素都是指针,每个元素都保存一个地址。1.1 使用指针数组保存多个数据的地址int main(){ int a[3] = { 1, 2, 3 }; int * p[3] = { 0 }; ...原创 2019-04-18 20:50:51 · 131 阅读 · 0 评论 -
C语言 strcpy 函数的实现及注意点
1、 strcpy 函数原型char * strcpy(char* str1, const char* str2);2、不使用库函数实现 strcpy 功能// C语言 版本#include <stdio.h>char* MyStrcpy(char* str1, const char* str2){ char* temp = str1; if ...原创 2019-04-19 00:15:46 · 1786 阅读 · 2 评论 -
C/C++ 中的位域
各种基本数据类型中,长度最小的char和bool在内存中占用一个字节的空间,但对于某些数据类型只需要几个二进制位即可保存,例如:enum GameResult { WIN, LOSE, TIE, CANCEL };由于它只有四种取值,只需要两个二进制位就可保存,而一个GameResult类型变量至少要占1个字节(8个二进制位),在很多编译器中,甚至还会占据更多的空间。单一变量所浪费的空间也许并...原创 2019-04-28 23:58:29 · 748 阅读 · 0 评论 -
【C++】string类的实现
string 类的实现是一个经常考的面试题,主要考察运算符的重载以及内存管理,还有可以考察面试者的代码风格。这是我自己实现的一个简单的 string 类,有需要的可以参考。代码如下:1、String.h// String.h#pragma once#include <iostream>using namespace std;class String{ // 重载 ......原创 2019-05-09 23:03:24 · 546 阅读 · 0 评论 -
个人银行账户管理程序(C++)
最近在复习 C++ 基础知识,遇到了这个案例,这个案例涵盖了 C++ 很多重要的知识,如果有需要可以参考,代码和书中的一样。程序分为 6 个文件:date.h 是日期类头文件,date.cpp 是日期类实现文件,accumulator.h 是为按日将数值累加的 Accumulator 类的头文件,account.h 是各个储蓄账户类定义头文件,account.cpp 是各个储蓄账户类实现文件...原创 2019-05-01 03:59:21 · 10087 阅读 · 5 评论 -
C++常用库
关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。原博客地址1、标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Template Library:标准模板库C ...转载 2019-05-08 20:27:16 · 545 阅读 · 1 评论 -
C++中字符串大小写字母转换
最近在学习 STL,string 也是 STL 中的一种容器,遇到一个字符串中字母大小写转换的例子,这里就顺便总结一下在C++中常用的字符串大小写转换方法,有需要的可以参考。代码如下:1、char[]类型,调用库函数//========================================== // Filename : 1、char[]类型,调用库函...原创 2019-05-06 10:54:29 · 13313 阅读 · 0 评论 -
动态数组的实现(C++)
这是用 C++ 封装的一个简单的动态数组类模板,它由任意多个位置连续的、类型相同的元素组成,其元素个数可在程序运行性改变,与 vector 的工作原理相同。并且使用这个动态数组实现求 2~n 区间之间不确定个数的质数。有需要可以参考,代码如下:// Array.h#pragma once#include <iostream>#include <cassert>...原创 2019-05-05 16:42:02 · 7253 阅读 · 1 评论 -
C/C++ 编译预处理及条件编译
在编译器对源程序进行编译之前,首先要由预处理器对程序文本进行预处理。预处理提供了一组编译预处理指令和预处理操作符。预处理指令实际上不是 C++ 语言的一部分,它只是用来扩充 C++ 程序设计的环境。所有的预处理指令在程序中都是以 “#”来引导,每一条预处理指令单独占用一行,不要用分号结束。预处理指令可以根据需要出现在程序的任何位置。1、#include 指令#include 指令也称为文件...原创 2019-04-29 21:02:09 · 789 阅读 · 0 评论 -
C/C++ 函数指针
指针变量可以指向任何类型的数据,也可以指向一个函数。每个函数在内存中都占用一段存储单元,这段存储单元的首地址称为函数的入口地址,指向这个函数入口地址的指针称为函数指针。1、函数指针基本用法:int max(int a, int b){ return a > b ? a : b;}int (*p) (int , int) = max;int x = 20, y = 30...原创 2019-04-24 21:31:22 · 289 阅读 · 0 评论