
C++
C++编程经验探讨
北木.
交流分享,共同成长
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
彻底理解——指针常量和常量指针、指向常量的常指针
前言 在汉语中,定语一般都放在中心词的前面,像C语言和C++语言这种技术性语言,更是如此。 所以定语重要还是中心词重要,肯定是中心词重要。 如:美丽的女孩 美丽的是定语 女孩是中心词 女孩肯定是重要,是本质。 同理,我们先不讲技术,先从字面意思来理解:指针常量、常量指针、函数指针、指针函数、数组指针、指针数组指针常量指针是定语,常量是中心词,所以指针常量本质是一个常量常量指针常量是定语,指针是中心词,所以常量指针本质是一个指针函数指针本质上是一个指针,那就原创 2020-10-30 16:41:53 · 7856 阅读 · 6 评论 -
排序算法第六讲 --- 归并排序(Python、C++、C)
排序算法系列目录 排序算法第一讲 — 冒泡排序(Python、C++、C) 排序算法第二讲 — 选择排序(Python、C++、C) 排序算法第三讲 — 插入排序(Python、C++、C) 排序算法第四讲 — 快速排序(Python、C++、C) 排序算法第五讲 — 希尔排序(Python、C++、C) 题目描述: 给你一个整数数组 nums,请你将该数组采用归并排序方式进行升序排列。 解题思路: 分治算法: 将一个比较大规模的问题分解成为若干个规模较小的问题,.原创 2020-07-11 13:13:58 · 375 阅读 · 0 评论 -
排序算法第五讲 --- 希尔排序(Python、C++、C)
题目描述: 给你一个整数数组 nums,请你将该数组采用希尔排序方式进行升序排列。希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序. 解题思路: 让我们先来回顾一下插入排序: 插入排序顾名思义,就是在排序的过程中,把数组的每一个元素按照大小关系,插入到前面有序区的对应位置。怎样可以对插入排序算法做出优化呢?从以下两个方面入手:在大多数元素已经有序的情况下,插入排序的工作量较小.原创 2020-07-10 10:59:09 · 357 阅读 · 0 评论 -
排序算法第四讲 --- 快速排序(Python、C++、C)
题目描述: 给你一个整数数组 nums,请你将该数组采用快速排序方式进行升序排列。输入示例: [1,8,6,2,5,4,9,3,7]输出示例: [1,2,3,4,5,6,7,8,9] 解题思路: 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数.原创 2020-07-06 21:51:40 · 526 阅读 · 0 评论 -
排序算法第三讲 --- 插入排序(Python、C++、C)
题目描述: 给你一个整数数组 nums,请你将该数组采用插入排序方式进行升序排列。 解题思路: 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 代码: Python写法:class Solution(object): def solution(self, nums): n = len(nums) for i in range(1, n): for j in range.原创 2020-07-06 15:57:14 · 294 阅读 · 0 评论 -
排序算法第二讲 --- 选择排序(Python、C++、C)
题目描述: 给你一个整数数组 nums,请你将该数组采用选择排序方式进行升序排列。 解题思路: 选择排序的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 代码: Python写法:class Solution(object): def solution(self, nums): n = len(nums) j .原创 2020-07-05 22:31:46 · 385 阅读 · 0 评论 -
排序算法第一讲 --- 冒泡排序(Python、C++、C、java)
题目描述: 给你一个整数数组 nums,请你将该数组采用冒泡方式进行升序排列。 解题思路: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 代码: Python写法:class Solution(object): def solution(.原创 2020-07-05 15:03:26 · 459 阅读 · 0 评论 -
Canny边缘检测图像 findContours
//定义Canny边缘检测图像 Mat canny_output;vector<vector<Point> > contours;//是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的point点构成的点的集合的向量,每一组point点集就是一个轮廓,有多少轮廓,向量contours就有多少元素vector<Vec4i> hierarchy; vector<vector<Point> > contours 的功能是在op原创 2020-06-12 10:14:25 · 2330 阅读 · 0 评论 -
Python、C++表示整数最大最小值
Python方法的最大最小值:import sysmax_num = sys.maxsizeprint(max_num) # 最大值 9223372036854775807min_num = -sys.maxsize - 1print(min_num) # 最小值 -9223372036854775808C++方法的最大最小值:#define INT_MAX 0x7fffffff#define INT_MIN 0x80000000 INT_MAX = 2147483647I原创 2020-05-27 10:25:34 · 1016 阅读 · 0 评论 -
C++ 中string.erase() 的用法
1、string.erase(pos,n) //删除从pos开始的n个字符 string.erase(0,1); 删除第一个字符#include <string>#include <iostream> using namespace std; int main(){ string::iterator i; string ...转载 2020-03-04 10:03:41 · 1985 阅读 · 0 评论 -
C++之vector的用法
vector(向量): C++中的一种数据结构,确切的说是一个类。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时, 用其来解决问题可以达到最大节约空间的目的。 用法: 文件包含: 首先在程序开头处加上 #include<vector> 以包含所需要的类文件vector;变量声明:2.1 例:声明一个 int 向量以替代一维的数组:vect...原创 2020-02-27 14:57:30 · 291 阅读 · 2 评论 -
C++之个人银行账户管理程序(二)
博文回顾 C++之个人银行账户管理程序(一) 基于上一篇的基础,本博文要解决总账户金额的存储和维护,以及日期的友好表示。1.data.h//date.h#ifndef __DATE_H__#define __DATE_H__class Date { //日期类private: int year; //年 int month; //月 int day; //日...原创 2020-02-23 21:25:18 · 2125 阅读 · 0 评论 -
C++之个人银行账户管理程序
一个活期储蓄账户包括:信息:账号(id)、金额(balance)、年利率(rate)等操作:显示账户信息(show)、存款(deposit)、取款(withdraw)、结算利息(settle)等实现该类的难点在于利息的变化,由于账户的余额是不断变化的,因此:余额 x 年利率 = 年利?(NO)一年当中的余额累积起来/一年的总天数=日均余额日均余额 x 年利率 = 年利 (YES...原创 2020-02-23 17:28:10 · 3705 阅读 · 0 评论 -
C++之vector对象
为什么需要vector?封装任何类型的动态数组,自动创建和删除。数组下标越界检查。vector对象的定义vector<元素类型> 数组对象名(数组长度);例: vector arr(5)建立大小为5的int数组vector对象的使用对数组元素的引用: vector对象名 [ 下标表达式 ]vector数组对象名不表示数组首地址获得数组长度,用size函数...原创 2020-02-23 13:56:26 · 471 阅读 · 0 评论 -
C++之动态内存分配
动态申请内存操作符: newnew 类型名T(初始化参数列表)功能: 在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果: 如果成功,则返回T类型的指针,指向新分配的内存;如果失败,则抛出异常。释放内存操作符deletedelete 指针p功能: 释放指针p所指向的内存。p必须是new操作的返回值。动态创建对象举例#include <iostr...原创 2020-02-23 13:29:18 · 471 阅读 · 0 评论 -
C++之对象指针
对象指针定义形式: 类名 *对象指针名;Point a(5,10);Piont *ptr;ptr=&a;通过指针访问对象成员: 对象指针名->成员名ptr->getx() 相当于 (*ptr).getx();例: 使用指针来访问Point类的成员#include <iostream>using namespace std;class Poi...原创 2020-02-23 13:09:31 · 609 阅读 · 0 评论 -
C++之指针与函数
以指针作为函数参数需要数据双向传递时需要传递一组数据,只传首地址运行效率比较高例: 读入三个浮点数,将整数部分和小数部分分别输出#include <iostream>using namespace std;void splitFloat(float x, int *intPart, float *fracPart) { *intPart = static_cas...原创 2020-02-22 22:39:35 · 276 阅读 · 0 评论 -
C++之指针和数组
用指针访问数组元素数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组。定义指向数组元素的指针定义与赋值例:int a[10], *pa;pa=&a[0]; 或 pa=a;经过上述定义及赋值: *pa 就是a[0],*(pa+1) 就是 a[1],… ,*(pa+i)就是a[i].a[i], *(pa+i), *(a+i)...原创 2020-02-22 22:12:07 · 298 阅读 · 0 评论 -
C++之对象数组以及使用指针来传递地址
题目描述 声明一个Employee类,其中包括表示姓名、街道地址、城市和邮编等属性,包括ChangeName()和display()等函数。Display()使用cout语句显示姓名、地址、城市和邮编等属性,函数setName()改变对象的姓名属性,实现并测试这个类。一个文件时:#include <iostream>#include <string>using...原创 2020-02-22 21:46:26 · 2097 阅读 · 0 评论 -
C++之基于范围的for循环
详见蓝色字体可比较出来:int main(){ int array[3] = {1,2,3}; int *p; for(p = array; p < array + sizeof(array) / sizeof(int); ++p){ *p += 2; std::cout << *p << std::endl; }return 0;...原创 2020-02-22 18:16:57 · 169 阅读 · 0 评论 -
C++之对象数组
对象数组的定义与访问定义对象数组 类名 数组名[元素个数];访问对象数组元素 通过下标访问 数组名[下标].成员名对象数组初始化 数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:Point a[2]={Point(1,2),Point(3,4)}; 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数...原创 2020-02-22 15:50:29 · 890 阅读 · 0 评论 -
C++之数组做函数参数
题目描述:主函数中初始化一个二维数组,表示一个矩阵,将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。#include <iostream>using namespace std;void rowSum(int a[][4], int nRow) { for (int i = 0; i < n...原创 2020-02-22 15:04:12 · 1590 阅读 · 0 评论 -
多文件结构和预编译命令
C++程序的一般组织结构一个工程可以划分为多个源文件:类声明文件(.h文件)类实现文件(.cpp文件)类的使用文件(main()所在的.cpp文件)利用工程来组合各个文件例: 多文件的工程//文件1,类的定义,Point.h#include <iostream>using namespace std;class Point { //类的定义public: ...原创 2020-02-22 14:01:43 · 615 阅读 · 0 评论 -
C++之共享数据的保护
共享数据的保护对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰)。对于不改变对象状态的成员函数应该声明为常函数。常类型常对象:必须进行初始化,不能被更新。const 类名 对象名用const进行修饰的类成员:常数据成员和常函数成员常引用:被引用的对象不能被更新。常数组:数组元素不能被更新常指针:指向常量的指针常对象用const修饰的对象cl...原创 2020-02-22 12:37:09 · 493 阅读 · 0 评论 -
C++之类的友元
类的友元友元是C++提供的一种破坏数据封装和数据隐藏的机制。通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。友元函数友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问 private 和...原创 2020-02-21 23:19:40 · 192 阅读 · 0 评论 -
C++之类的静态成员
类的静态成员用关键字static声明为该类的所有对象共享,静态数据成员具有静态生存期。必须在类外定义和初始化,用(::)来指明所属的类。#include <iostream>using namespace std;class Point { //Point类定义public: //外部接口 Point(int x = 0, int y = 0)...原创 2020-02-21 22:59:49 · 159 阅读 · 0 评论 -
对象的生存期
静态生存期这种生存期与程序的运行期相同。在文件作用域中声明的对象具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static 。动态生存期没有用static修饰的对象是动态生存期的对象(习惯称局部生存期对象)开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。 划重点 静态生存期的变量,即使当程序的执行流程,离开了这个变量这个对象的作用域,其中的值...原创 2020-02-21 22:25:48 · 541 阅读 · 0 评论 -
类和对象--构建CPU类,RAM类,CD_ROM类,COMPUTER类
问题描述:构建电脑类:CPU类,RAM类,CD_ROM类,COMPUTER类,并且要求: 1. 声明私有数据成员cpu、ram、cdrom,声明公有成员函数run、stop,可在其中输出提示信息。2. 在main()函数中声明一个Computer类的对象,调用其成员函数。1. 声明一个CPU类:#include<iostream>using namespace std;en...原创 2020-02-21 16:41:42 · 4453 阅读 · 0 评论 -
CPU类的设计
题目描述:声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run和stop其中,rank为枚举类型CPU_Rank,声明为enum CPU_Rank{P1=1,P2,P3,P4,P5,P6,P7};frequency为单位是MHz的整型数,vlotage为浮点型的电压值。(1). 分别编写不同的set函数和get函数修改、...原创 2020-02-21 14:42:25 · 2665 阅读 · 2 评论 -
C++之枚举类
1. 枚举类定义语法形式enum class 枚举类型名: 底层类型 {枚举值列表}; 如果不指定底层类型,默认为int例:enum class Type { General, Light, Medium, Heavy};enum class Type: char { General, Light, Medium, Heavy};enum class Category { Gene...原创 2020-02-20 15:23:41 · 620 阅读 · 0 评论 -
C++之结构体
结构体是一种特殊形态的类与类的唯一区别:类的缺省访问权限是private,结构体的缺省访问权限是public结构体存在的主要原因:与C语言保持兼容什么时候用结构体而不用类3. 定义主要用来保存数据、而没有什么操作的类型4. 人们习惯将结构体的数据成员设为公有,因此这时用结构体更方便结构体的定义struct 结构体名称 { 公有成员protected: 保护型成员p...原创 2020-02-20 15:10:33 · 383 阅读 · 0 评论 -
C++之析构函数
C++语法规定了在构造对象的时候一定需要构造函数,而在删除对象的时候一定需要析构函数。 析构函数原型: ~类名(); 析构函数没有参数,没有返回值类型完成对象被删除前的一些清理工作。在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。构造函数和析构函数举例#includ...原创 2020-02-20 11:16:13 · 302 阅读 · 0 评论 -
C++之面向对象程序设计的基本特点
抽象 – 封装 – 继承 – 多态 抽象: 对同一类对象的共同属性和行为进行概括,形成类。先注意问题的本质及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:类。抽象实例——钟表数据抽象: int hour,int minute,int second代...原创 2020-02-19 15:47:44 · 395 阅读 · 0 评论 -
C++之系统函数
引入系统函数 #include <cmath>例: 求输入角度的三角函数值#include <iostream>#include <cmath>using namespace std;const double PI = 3.1415;int main(){ double angle; cout << "please enter a...原创 2020-02-19 11:26:01 · 504 阅读 · 0 评论 -
C++之函数重载
C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。例:1). 形参类型不同int add (int x, int y)float add (float x, float y)2). 形参个数不同int add (int x, int y)int add (int x, int y, int z)注意事项 重载函数的形参必须不同:个数不...原创 2020-02-19 11:01:34 · 270 阅读 · 0 评论 -
C++之默认参数值的函数
默认参数值的函数在定义一个函数的时候,可以预先给这些形参确定默认的值。调用时如果传递实参,就用你传递的值,否则就用默认的值。例:int Add(int x=5, int y=6){ return x+y;}int main(){ Add(10,20); //10+20 Add(10); //10+6 Add(); //5+6 return 0;}默认参数...原创 2020-02-19 00:45:15 · 757 阅读 · 0 评论 -
C++之内联函数
内联函数的作用:是让我们在调用简单函数的时候,能够提高运行效率的函数。 内联函数声明时使用的关键字 inline 注意: 内联函数体内不能有循环语句和switch语句内联函数的定义必须出现在内联函数第一次调用之前对内联函数不能进行异常接口声明栗子:#include <iostream>using namespace std;const PI = 3.1415...原创 2020-02-19 00:15:02 · 320 阅读 · 0 评论 -
C++之可变参数的函数(initialize_list)
C++提供了两种主要的方法1.如果所有的实参类型相同,可以传递一个 initialize_list 的标准库类型。2.如果实参的类型不同,我们可以编写可变参数的模板。initialize_list <string> ls // initialize_list的元素类型是stringinitialize_list <int> li // initialize...原创 2020-02-18 22:59:44 · 1152 阅读 · 0 评论 -
C++之引用类型
引用(&)是标识符的别名引例:#include <iostream>using namespace std;int main(){ int i, j; int &r = i; //定义int引用r,并初始化为变量i的引用,以后不可改变 j = 10; r = j; //相当于 i=j cout << "i=" <...原创 2020-02-18 22:40:22 · 217 阅读 · 0 评论 -
C++声明一个表示时间的结构体,然后完整的显示出来
栗子:C++声明一个表示时间的结构体,提示用户输入,然后完整的显示出来#include <iostream>using namespace std;struct MyTimeStruct{ unsigned int year; unsigned int month; unsigned int day; unsigned int hour; unsigned int ...原创 2020-02-18 00:40:08 · 3983 阅读 · 0 评论