![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 97
雪山上的小草
每天都是初学者
展开
-
C++ set容器简单用法
set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetri...转载 2018-11-06 21:23:11 · 243 阅读 · 0 评论 -
C++传递引用与传指针、传值的区别
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;引用最大的好处就是提高函数效率以及节省空间;关键问题一、传递引用与传指针、传值的区别? 值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对象时,要调用拷贝构造函数...转载 2018-12-29 19:20:35 · 358 阅读 · 0 评论 -
C++传递引用与传指针、传值的区别
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;引用最大的好处就是提高函数效率以及节省空间;关键问题一、传递引用与传指针、传值的区别? 值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对象时,要调用拷贝构造函数...转载 2018-12-29 19:20:30 · 703 阅读 · 0 评论 -
C++指针和数组的区别(不能混用的情况)
通常情况下,C++中指针和数组是可以混用的,但是,在编写字符数组的全排列的时候,混用却出了问题,因此,今天特地mark一下,以备日后查找 这里整理的,不包括用new开辟的动态数组1.数组一旦声明,我们就不能再给它赋值,但是我们可以给指针赋值如下:5、6行都错,因为数组s不能作为左值被赋值报错阶段:程序会在编译时报错int main(){ char s[]="1...转载 2018-12-29 18:55:30 · 330 阅读 · 0 评论 -
C++中为什么构造函数不能定义为虚函数
关于C++为什么不支持虚拟构造函数,Bjarne很早以前就在C++Style and Technique FAQ里面做过回答Avirtual call is a mechanism to get work done given partialinformation. In particular, "virtual" allows us to call afunction knowing onl...转载 2018-12-29 17:00:39 · 514 阅读 · 0 评论 -
C++ 类的存储方式以及虚函数表
一、C++成员函数在内存中的存储方式 用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元,如下图所示。 能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如...转载 2018-12-24 17:22:26 · 878 阅读 · 0 评论 -
STL源码剖析之哈希表 hashtable
哈希表,一种键值对用的关系。具有关联性。也称散列表,主要是通过特殊算法建立值和键的关系,然后根据键值对应存储和搜索。因为是键值对应的关系,所以再键的存储上面,会出现一种【碰撞】问题,即根据算法计算两个不同的值对应了同一个键,因为导致键的存储冲突。哈希表根据解决【碰撞】的方案不同而产生了几种存储表现,不同的存储表现有不同的存储搜索效率。线性探测,二次探测,开链。【一】线性探测...转载 2018-12-24 11:02:16 · 373 阅读 · 1 评论 -
C++:多维数组的动态分配(new)和释放(delete)
对于简单的一维数组动态内存分配和释放,相信大家都是知道的,不过还是举个例子吧:#include<iostream>using namespace std;int main(){ int n; cin>>n; //分配动态一维数组 int *arr=new int[n]; for(int i=0;i<n;i...转载 2018-12-29 10:32:30 · 2905 阅读 · 0 评论 -
判断两个单链表是否相交及找到第一个交点
题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点。 这道题的思路和解法有很多,在这把这道题的解法做一个详细的总结。解这道题之前,我们需要首先明确一个概念: 如果两个单链表有共同的节点,那么从第一个共同节点开始,后面的节点都会重叠,直到链表结束。 因为两个链表中有一个共同节点,则这个节点里的指针域指向的下一个节点地址一样,所以下一个节点也会相交,依次类推。所以...转载 2018-12-23 16:24:56 · 542 阅读 · 0 评论 -
C++中指针和引用的区别
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传...转载 2018-12-30 12:28:08 · 88 阅读 · 0 评论 -
c++访问私有(private)成员变量的常用方法
类的对象不能直接访问类声明的私有成员变量,否则破坏了信息隐藏的目的。在C++中,为了防止某些数据成员或成员函数从外部被直接访问,可以将它们声明为private,这样编译器会阻止任何来自外部非友元的直接访问。私有成员变量的常用访问方法如下:(1)通过公共函数为私有成员赋值#include <iostream> using namespace std; class...转载 2018-12-30 16:56:28 · 3228 阅读 · 0 评论 -
TopSort(拓扑排序)中DFS和BFS的应用
深度优先搜索:下面图中的数字显示了深度优先搜索顶点被访问的顺序。为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。广度优先搜索:在深度优先搜索中,算法表现得好像要尽快地远离起始点似的...原创 2018-12-25 21:51:30 · 214 阅读 · 0 评论 -
c++拷贝构造函数详解
一、什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象拷贝的简单例子。 #include<iostream>using namespace std;class CExample...转载 2018-12-31 17:08:06 · 2816 阅读 · 0 评论 -
重新认识memset函数及c++中数组的初始化赋值
下面就好好重新认识一下这个函数,自己写了测试的代码,memset到底怎么用呢?先贴测试代码:#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<queue> usin...转载 2018-12-27 13:37:34 · 718 阅读 · 0 评论 -
拷贝构造函数的参数类型必须是引用
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答。不过还好,我思索一下以后,发现这个答案是不对的。原因: 如果拷贝构造函数中的参数不是一个引用,即形如CCla...转载 2018-12-31 11:37:22 · 3308 阅读 · 0 评论 -
红黑树(一)之 原理和算法详细介绍
红黑树的应用红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。 红黑树的时间复杂度和相关证明红黑树的时间复杂度为: O(lgn)下面通过“数学归纳法”对红黑树的时间复杂度进行证明。定理:一棵...转载 2018-12-25 16:28:26 · 199 阅读 · 0 评论 -
C++中指针和引用的区别
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传...转载 2018-12-30 17:47:46 · 124 阅读 · 0 评论 -
const关键字对C++成员函数的修饰
const对C++成员函数的修饰分为三种:1. 修饰参数;2. 修饰返回值;3. 修饰this指针。简述一下知识点如下,以后找功夫再完善。1. 对函数参数的修饰。 1)const只能用来修饰输入参数。输出型参数不能用const来修饰。 2)如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。 3)如果输入参数采用“值传递”,函数将产生临时...转载 2018-12-30 17:30:14 · 182 阅读 · 0 评论 -
希尔排序算法
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越...转载 2018-12-28 15:54:26 · 190 阅读 · 0 评论 -
各种排序算法总结和比较
排序算法可以说是一项基本功,解决实际问题中经常遇到,针对实际数据的特点选择合适的排序算法可以使程序获得更高的效率,有时候排序的稳定性还是实际问题中必须考虑的,这篇博客对常见的排序算法进行整理,包括:插入排序、选择排序、冒泡排序、快速排序、堆排序、归并排序、希尔排序、二叉树排序、计数排序、桶排序、基数排序。 代码都经过了CodeBlocks的调试,但是很可能有没注意到的B...转载 2018-12-27 22:40:57 · 155 阅读 · 0 评论 -
STL中的容器
在STL中基本容器有: vector、list、deque、set、mapset 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是...转载 2018-12-15 17:02:47 · 517 阅读 · 0 评论 -
C++ STL 之 vector 的 capacity 和 size 属性区别
C++ STL 之 vector 的 capacity 和 size 属性区别size 是当前 vector 容器真实占用的大小,也就是容器当前拥有多少个容器。capacity 是指在发生 realloc 前能允许的最大元素数,即预分配的内存空间。当然,这两个属性分别对应两个方法:resize() 和 reserve()。使用 resize() 容器内的对象内存空间是真正存在的。...转载 2018-12-15 15:37:15 · 221 阅读 · 0 评论 -
c/c++字符串处理大集合
rember this strncpy(a,b,5); a[5]='\0'; char a[10]; memset(a,'#',sizeof(a)); a[10]='\0'; 刚开始学C/C++时,一直对字符串处理函数一知半解,这里列举C/C++字符串处理函数 ,希望对初学者有一定的帮助。 C: char st[100]; ...转载 2018-12-15 11:33:15 · 123 阅读 · 0 评论 -
C++11—引入nullprt
1. 引入nullptr的原因引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。1.1 NULL在C中的定义在C中,习惯将NULL定义为void*指针值0:[cpp] view plaincopy#de...转载 2018-12-14 20:51:48 · 347 阅读 · 0 评论 -
详解C语言中const关键字的用法
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点:1、预编译指令只是对值进行简单的替换,不能进行类型检查2、可以保护被修饰的东西,防止意外修改,增强程序...转载 2018-12-14 20:32:34 · 182 阅读 · 0 评论 -
c++中的常量,常对象,常引用,常指针
所谓常量是指在程序运行中值始终不可改变的量。而常对象是指他的数据成员在对象的整个生存周期内不能改变。这也意味着不能用常对象去调用普通的成员函数,因为有可能会改变常对象的数据成员,所以便有了常成员函数。如果一个对象被声明为常对象,他只能调用常成员函数。普通对象也能调用常成员函数,但是会被视为常对象,即不能改变数据成员的值。 c++中用引用作形参来对实参进行操作而提高效率,但是有时不希望...原创 2018-12-06 20:36:14 · 1075 阅读 · 0 评论 -
C++11 lambda 表达式解析
C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看。本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式。很多语言都提供了 lambda 表达式,如 Python,Java 8。lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么...转载 2018-12-13 20:47:25 · 94 阅读 · 1 评论 -
C++中map和set的使用与区别
setset是一种关联式容器,其特性如下:set以RBTree作为底层容器 所得元素的只有key没有value,value就是key 不允许出现键值重复 所有的元素都会被自动排序 不能通过迭代器来改变set的值,因为set的值就是键针对这五点来说,前四点都不用再多作说明,第五点需要做一下说明。如果set中允许修改键值的话,那么首先需要删除该键,然后调节平衡,在插入修改后的键值,再...转载 2018-12-15 17:17:54 · 1186 阅读 · 0 评论 -
STL中map、set的数据结构及底层实现
本文分析了STL的map和setvector(向量)——STL中标准而安全的数组。只能在vector 的“前面”增加数据。deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。 list(列表)——游标一次只可以移动一步。如果你对链表已经很熟悉,那么STL中的list则是一个双向链表(每个节点有指向前驱和指向后继的两...转载 2018-12-15 17:19:58 · 8244 阅读 · 0 评论 -
32、64位编译器各类型大小和字节对齐
32位编译器:32位系统下指针占用4字节 char:1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器) shortint :2个字节 int: 4个字节 unsigned int: 4个字节 float: 4个字节 do...转载 2018-12-27 22:06:31 · 1758 阅读 · 0 评论 -
c++中的虚函数
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的...转载 2018-12-27 16:41:54 · 1087 阅读 · 0 评论 -
C++之deque
deque(包含头文件#include<deque>)由若干段连续空间串接而成,一旦有必要在deque的头部或尾端增加新的空间,便配置一段定量连续的空间,串接在deque的头部或尾端。deque的最大任务,就是在这些分段连续的空间上维护其整体连续的假象,并提供随机存取的接口。 实际上。deque内部会维护一个map(注意!不是STL中的map容器)即一小块连续...转载 2018-12-26 21:33:04 · 800 阅读 · 0 评论 -
C++ STL中的vector的内存分配与释放
1.vector的内存增长vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比...转载 2018-12-26 21:19:04 · 1576 阅读 · 0 评论 -
c++map容器介绍
Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。 2、map的功能自动建立Key - value...转载 2018-12-26 21:12:27 · 1335 阅读 · 2 评论 -
HTTP缓存机制
一、概述 缓存通俗点讲,就是将已经得到的‘东东’存放在一个相对于自己而言,尽可能近的地方,以便下次需要时,不会再二笔地跑到起始点(很远的地方)去获取,而是就近解决,从而缩短时间和节约金钱(坐车要钱嘛)。Web缓存,也是同样的道理,说白了,就是当你第一次访问网址时,将这个东东(representations),如html页面、图片、JavaScript文件等,存在一个离你较近的地方,当你下次还需要...转载 2018-12-15 21:14:02 · 83 阅读 · 0 评论 -
C++STL常见面试题
1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等2.标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为R...转载 2018-12-15 20:26:34 · 133 阅读 · 0 评论 -
C\C++中函数后面加const
c++ 在函数后加const的意义: 我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对...转载 2018-12-15 17:53:01 · 11714 阅读 · 0 评论