![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
嘻嘻作者哈哈
喜欢折腾技术。寒窗苦读无人晓,一朝成名天下知。
展开
-
结构体成员变量指针与普通数据类型指针比较
写这篇文章的原因是,我很好奇链表的结点删除算法为啥修改了指针域的值就可以。还是用代码来说事吧,简单的写一个测试案例:#include<stdio.h>typedef struct{ int* p;}*pstru;void ChangeIntPointerOne(int* p, int *q){ p = q;}void ChangeIntPointerTwo(i...原创 2019-05-19 16:27:44 · 2443 阅读 · 1 评论 -
C++引用与模板(forward+move实现完美转发)
一、使用模板,可以实现左值引用和右值引用,当实参可能会左值,也可能为右值时使用引用结合模板。二、两个重要工具 1、move:实现移动语义,将左值变为右值。使用语法:move(左值)。 2、forward:可以保持数据的类型不变,可用于实现完美传参和完美转发。 2.1、为啥需要forward:因为在C++函数调用时,实参变量都会变为左值,而实参本身可能不是左值,这就导致实参失去了原来...原创 2020-02-09 21:48:14 · 714 阅读 · 0 评论 -
C++析构和构造函数执行顺序(继承和内嵌成员对象)
结论:C++处理多个对象、以及成员对象和继承时,构造函数的执行顺序与析构顺序相反。也就是先调用构造函数的对象,会后调用析构函数,有点像栈的先入后出。例子1:封闭类和成员对象 1、定义:一个类的成员变量是另一个类的对象,则称该成员变量为内嵌成员对象,包含成员对象的类为封闭类。 2.此时的封闭类和成员对象是 包含(从属)关系,也就是封闭类有(has)成员对象。 例如计算机包含中央处理器和内存...原创 2020-02-09 01:24:28 · 1268 阅读 · 0 评论 -
自定义数据类型之间的相互转换和explicit关键字(C++)
问题引入: 对于C++类型系统提供的基本数据类型,只需按照C++对于的语法规则进行转换即可,但是对于用户自定义的数据类型,例如一个自定义的类,该如何转换?解决方法:2种。 法一:使用类型转换构造函数,在目标类型里面写实现代码。目标类型(const 源类型 &){ 目标类型成员变量赋值代码;}例如:将double转换为复数类Complex:源类型double,目标类型Co...原创 2020-02-02 18:10:30 · 544 阅读 · 0 评论 -
const_cast简单使用
一、语法const_cast<type>(expression)二、作用:实现const修饰的指针或引用的去const化。三、代码#include<iostream>using namespace std;//const_cast 只作用于指针和引用,去const化,把常变为非常void test01(){ int a; const int& ...原创 2020-01-31 01:15:07 · 443 阅读 · 0 评论 -
复数类的运算符重载加号和减号基础
一、重载运算符的目的:实现复数类对象之间直接进行运算,像基本数据类型一样。二、运算符重载实质:编写以运算符作为名称的函数。三、如何写:返回值类型 operator运算符(形参表){ 具体实现代码}注:运算符可以被多次重载。运算符可以重载为全局函数,也可以重载为类的成员函数。四、复数类加减代码。#include<iostream>using namespace st...原创 2020-01-30 00:33:34 · 1466 阅读 · 0 评论 -
C++ 数字与字符串之间相互转换(多种方法)
使用系统提供的库函数1.字符串传数字 (1)、使用atoi()char str3[10] = "3245345";//数字简单,所以转数字一个参数 long long a = atoi(str3); cout << a << endl; (2)、使用 sscanf() 映射long long c = 0;char str5[10] = "6612345...原创 2020-01-21 16:55:07 · 62752 阅读 · 11 评论 -
类模板分文件编写遇到的问题和解决方法
1.问题引入: 当使用类模板的成员函数的具体实现与声明分别写在不同的文件时,出现错误,使用vs作为IDE。错误代码:main.cpp#include"person.h"void test01() { Person<string, int> p("赵云", 38); p.showPerson();}int main() { test01(); return 0;...原创 2020-01-20 16:42:05 · 467 阅读 · 0 评论 -
C++文件基本操作
一、文件分类: 1.文本文件:文件使用文本的ASCII码形式存储在计算机中; 2.二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂。二、操作文件的三大类:1、fstream:读写操作2、ofstream:写操作3、ifstream:读操作三、常见文件打开方式:ios::in 为读文件而打开文件ios::out 为写文件而打开文件ios::ate 打开...原创 2020-01-16 12:06:34 · 10746 阅读 · 8 评论 -
内存四区
内存四区⑴ 代码区:①、存放cpu执行的机器指令; ②、代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一个即可; ③、代码区是只读的,只读的原因是防止程序以外的修改了他的指令。⑵ 全局区:①、存储全局变量、静态变量,全局变量在main之前执行,全局变量和静态变量一旦创建,直到程序运行结束才会死亡;②、全局区还包括全局常量、字符串常量;③、全局区的数据在程序执行结束后由操作系...原创 2020-01-08 17:15:26 · 103 阅读 · 0 评论 -
C++类的内部定义类的对象的错误解析
在初学过程中,一个课后习题,我做错了,于是有了这个文章。错误如下:原因分析:因为在类定义一个对象时,编译器会根据类的内存大小为该对象分配内存空间。然而对于B next; 此时类B还没有定义结束,编译器还不知道类B占多大字节,所以也就无法为对象next分配内存空间,所以报错。对于A* p;和A& r; 指针和引用类型编译器是知道它占多大内存的,所以可以分配空间,不会报错。...原创 2020-01-01 12:02:00 · 1153 阅读 · 3 评论 -
C++构造函数与析构函数
语法规则在代码注释里,对照代码看哦,便于理解,可以直接将代码拷贝到你的IDE或者编辑器里。1.构造函数语法规则在代码注释里,对照代码看哦,便于理解,可以直接将代码拷贝到你的IDE或者编辑器里。#include <iostream>using namespace std;//构造函数(constructor):函数名与类名相同,用于初始化成员变量,即初始化对象的内存空间 //...原创 2019-12-31 23:12:02 · 136 阅读 · 0 评论 -
[C/C++基础知识] main函数的参数argc和argv
该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助.一.main()函数参数通常我们在写主函数时都是void main()或int main() {..return 0;},但ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99中main()函数主要形式为:(1).int main...转载 2019-04-29 10:56:55 · 1356 阅读 · 1 评论 -
C++使用库函数查找最大值和最小值操作
头文件:< algorithm >1.两个数找最小值: int min_data = min(10,20); cout<< "min_data:" << min_data <<endl; //102.找一个系列里的最小值 (使用initializer_list<>)//利用min( {} ) min_data = m...原创 2019-03-26 22:14:33 · 26644 阅读 · 0 评论 -
auto 的使用场景(c++)
1.auto的功能:auto 可以自动推理数据类型。auto使用语法如下:#include<iostream>#include<typeinfo>using namespace std;int main(){ //auto变量定义时必须初始化 auto x = 3; auto y{23}; //auto c; //定义...原创 2019-03-23 17:18:42 · 1016 阅读 · 0 评论 -
list容器部分API
list容器是循环双链表,因为存储空间不连续,所以他的迭代器不支持随机访问,进行排序时不能使用algorithm 里的sort,使用list自身的成员函数sort进行排序.#include<iostream>#include<list>#include<string>using namespace std;//list是一个双向循环链表,list迭代...原创 2019-03-13 10:32:23 · 209 阅读 · 0 评论 -
leetcode 整数拆分(c++)
思路:先用暴力递归,之后用记忆化搜索,最后动态规划.枚举所有可能:以计算4为例如上图所示,2被重复计算,所以可以使用记忆化搜索,将第一次计算得到的结果保存下来,当以后再出现时直接使用第一次计算得到的值。vs2019运行代码#include<iostream>#include<algorithm> //max#include<ctime>#i...原创 2019-03-08 21:16:18 · 1518 阅读 · 1 评论 -
string容器部分API复习(C++)
注: 文章为本人为方便复习而写,若有朋友要参考,本文的不清楚的地方可以留言,也可以参考其他网页。#include<iostream>#include<string>using namespace std;//存数据:初始化和赋值APIvoid test_one(){ string str1("hello zhangqu"); //初始化 cout <...原创 2019-03-06 16:21:56 · 231 阅读 · 0 评论 -
C++的vector容器
注: 文章为本人为方便复习而写,若有朋友要参考,本文的不清楚的地方可以留言,也可以参考其他网页。#include<iostream>#include<vector>#include<list>using namespace std;//容量与实际数据量void test_one(){ vector<int> v; for (in...原创 2019-03-06 21:16:23 · 173 阅读 · 0 评论 -
一般递归时间复杂度分析
使用:master公式计算。当满足T (n) = a * T(n/b) + O(n^d) 时。其中T(n)为样本量的时间复杂度,a为子过程发生多少次,T(n/b)子过程的样本量的时间复杂度,O(n ^b)为除了子过程以外,其他操作所需的时间复杂度。1.log(b,a) < d 时,时间复杂度为O(n^d) 。2.log(b,a) = d 时,时间复杂度为O(n^d * log n)...原创 2019-03-14 16:48:50 · 1303 阅读 · 0 评论 -
deque容器部分API
deque:双端队列。是一种具有队列和栈的性质的数据结构,双端数组.注: 文章为本人为方便复习而写,若有朋友要参考,本文的不清楚的地方可以留言,也可以参考其他网页。#include&lt;iostream&gt;#include&lt;deque&gt;using namespace std;//双端数组void print(const deque&lt;int&gt;&amp;原创 2019-03-10 15:35:58 · 268 阅读 · 0 评论 -
stl里反转函数(reverse)总结
总结:0.algorithm 里的反转函数接口:reverse(first,last) 参数为容器的迭代器起始位置和终止位置1.string和vector只能使用模板库算法里的反转函数2.list可以使用算法里的和list类的reverse3.stack和queue没有迭代器,自然不能使用算法里的reverse,其类也没有提供反转的成员函数4.set和map的元素是按照键值排序的,不能修...原创 2019-03-15 09:59:13 · 6475 阅读 · 0 评论 -
集合set/multiset容器部分API总结
1.set容器是一种关联式容器,在插入数据时会根据键值进行排序,不允许出现重复的键值。2.set容器不能通过迭代器来修改键值,其迭代器不支持随机访问.3.multiset允许键值重复#include<iostream>#include<set> //set 或 multiset#include<string>using namespace...原创 2019-03-15 14:44:49 · 258 阅读 · 0 评论 -
c++里对组pair的使用
//对组pair:对组中的两个元素的数据类型可以一样,也可以不一样void test_pair() { pair<string, int> p1((string)"prim", 23); //1,使用拷贝构造方式创建 cout << "name : " << p1.first << " ";原创 2019-03-15 14:48:26 · 1109 阅读 · 0 评论 -
C++里map/multimap部分API总结
1.map容器是一种关联式容器,在插入数据时会根据键值进行排序插入。2.map容器的每一个元素都是对组,pair<key, value>,其中第一个key为键值,第二个value为实值。3.键值不可以修改,实值可以修改,可以使用at(key)来访问实值.4.map的迭代器不支持随机访问。5.map的键值不允许重复,而multimap的键值可以重复.#include<io...原创 2019-03-15 14:55:16 · 978 阅读 · 0 评论 -
检验算法是否正确的一个工具(就是模板,背诵下来):对数器(C++版)
对数器:很多测试算法的案例,通过使用对数器可以检验你的算法是否正确。使用对数器:1.有一个你要测试的方法a:这里以插入排序为例template&amp;amp;amp;lt;typename T&amp;amp;amp;gt; void insertSort(T *arr, int size) { if (size &amp;amp;amp;lt;= 0) { cout &amp;amp;amp;lt;&原创 2019-03-11 21:01:29 · 621 阅读 · 0 评论 -
stl容器的对比与应用场景
1.使用场景:vector: 可以高效的随机存取或需要查询元素,不经常进行插入和删除list:需要经常或大量的插入和删除,不需要随机存取deque: 需要随机存取,且需要在两端进行插入和删除set:快速查找一个元素是否在某集合中,使用findmap:存储数据字典,需要方便的通过键值key查找和修改实值value2.性能对比:...原创 2019-03-20 13:04:20 · 360 阅读 · 0 评论 -
stack容器和queue容器常见API
注意:栈和队列不支持遍历操作,不支持下标访问元素。话不多说,直接来代码。1.stack容器include<iostream>#include<stack>using namespace std;//stack, 先进后出,只能从栈顶入从栈顶出,不支持遍历操作,也不能按下标访问数据,所以使用stack和队列是要注意规则void test_one(){ ...原创 2019-03-12 19:06:17 · 237 阅读 · 0 评论 -
对数器(C++的vector实现)
使用步骤:1.写出你要测试的算法,这里以从大到小的快速排序为例template<typename T>void quicksort(vector<T>& vec, int start, int end){ T key=vec[end]; //将枢纽值保存,枢纽值一趟排序就放在了最终位置,之前的数据大于他,之后的数据小于他 int i=e...原创 2019-03-21 11:06:01 · 1020 阅读 · 0 评论 -
C++浮点数输出精度设置(刷题遇到)
注:在iomanip头文件里1. 有效数据位数设置使用cout&amp;lt;&amp;lt;setprecision(n)来设置,n为有效数据的位数。注意:cout&amp;lt;&amp;lt;不要丢。2.小数点有保留几位cout&amp;lt;&amp;lt;setprecision(n)和以下几种中的其中一种一起用.cout&amp;lt;fixed;cout.setf(io原创 2019-02-20 00:57:10 · 5563 阅读 · 0 评论