
C++
文章平均质量分 72
ArchyLi
一个学习路上人。当然还差很多。
展开
-
稀疏矩阵的压缩存储
#include #include using namespace std;templateclass SparseMatrix{public: // 稀疏矩阵的压缩存储 SparseMatrix(int* array, size_t row, size_t col, const T& invalid) : _row(row) , _col(col) , _inval原创 2017-05-09 18:12:40 · 756 阅读 · 0 评论 -
模拟实现日期类
日期类好久没写了,重温一下以前的知识。写日期类需要注意的有:1、日期减日期的计算 2、关于输出输入重载的友元函数声明 3、构造函数的条件判断 4、拷贝构造函数的自我赋值判断实现代码如下:#include <iostream>using namespace std;class Date{public: //4个默认的成员函数 //构造、拷贝构造、赋值语句重载、析构函数原创 2017-10-25 22:20:48 · 487 阅读 · 0 评论 -
C++中防止一个类被继承
一、思路在C++的继承里面我们知道,子类的构造函数会调用父类的构造函数,子类的析构函数会调用父类的析构函数,因此我们便想办法禁止子类调用父类的构造函数和析构函数即可,因此提出了如下两种方法。二、方法①构造函数与析构函数设置为私有我们把父类的构造函数和析构函数定义为私有成员,此时子类便不可调用父类的构造函数和析构函数,因此便达成了防止一个类被继承的目的,但是此时又出现一个问题,我们如何区构造一个类对象原创 2017-11-18 12:07:08 · 2354 阅读 · 1 评论 -
判断机器大小端的两种实现方式
一、为什么会有大小端之分这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小原创 2017-11-18 15:12:31 · 8747 阅读 · 0 评论 -
关键字static总结
一、static修饰变量与函数static修饰变量包含了局部变量和全局变量。一般函数内部的变量放在栈区,但是会随着函数的周期而被释放。由函数内部new产生的动态数据则存放在堆区,静态数据则存放在全局数据区,全局数据区的数据并不会随着函数的退出而是放空间。(1)static修饰全局变量static写在全局变量前,该变量就被定义为一个静态全局变量#include <iostream> using n原创 2017-11-05 01:01:08 · 1182 阅读 · 0 评论 -
大数据处理
大数据处理并不要求手写代码,更重要的是叙述出来思路和方法,主要的解题思路有以下两个:方法:看能否用特殊的数据结构解决(位图、布隆过滤器、堆(TOP K 问题))哈希切分题目⒈ 给一个超过100G大小的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址?解决方法:哈希切分。将100G的文件分成1000份,通过同一个散列函数映射到相应的文件,此时同一个ip一定会映射到同一原创 2017-11-14 22:03:00 · 504 阅读 · 0 评论 -
如何定义一个只能在栈上生成对象的类
这道题主要考察我们对于C++的语法的理解和运用的程度。本文主要给出了两种方法实现。方法一:分析:如果我们建立对象只能在栈上生成而不能在堆上生成,那么需要考虑以下几点:当我们用new操作符时候,才会在堆上生成对象,所以我们需要让它无法使用。将operator new()设为私有即可。代码如下: class A { private : void * operator new原创 2017-11-14 22:27:18 · 387 阅读 · 0 评论 -
如何定义一个只能在堆上生成对象的类
这道题主要考察我们对于C++的语法的理解和运用的程度。在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。动态建立类对象,是使用new运算符将原创 2017-11-14 22:48:13 · 411 阅读 · 0 评论 -
命名空间的理解
一、为什么要有命名空间一个工程的完成,往往由不同的人来共同完成,此时就有可能出现一个问题,不同的人写的函数名字会和另外一个人写的函数名字相同,此时哪一个函数是我们需要的呢? 所以我们为了解决这样的冲突,便采用了命名空间的方法,所谓的命名空间便是由用户自定义一个作用域,在不同的命名空间作用域内并不会互相影响。二、命名空间的定义命名空间是建立一些互相冲突的作用域,把一些全局实体分隔开。命名空间存放的实原创 2017-11-16 00:43:05 · 886 阅读 · 0 评论 -
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
一、extern简介首先我们用一句话来形容extern的作用:解决名字匹配问题,实现C/C++混合编程。extern是C/C++语言表明函数和全局变量作用范围的关键字,其声明的函数和变量可以在本模块或其他模块中使用。通常我们在模块的头文件中对本模块提供给其他模块引用的函数或全局变量用关键字extern声明。被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。C++是一种面向对象的语言原创 2017-10-30 17:36:24 · 1281 阅读 · 0 评论 -
C++实现复杂链表的复制
一、什么是复杂链表复杂链表的每个结点具有三个成员,分别是存放数据的data和指向下一个结点的指针和指向随机节点的指针。 复杂结点的结构:template <class T>struct ListNode{ T data; ListNode<T>* next; ListNode<T>* random; ListNode(const T& d) :d原创 2017-11-07 00:25:43 · 2027 阅读 · 0 评论 -
关于const知识点总结
1、基本描述定义变量的限定符,表示变量值不可改变const int a = 1024;a = 1024;//错误,不能向const对象写值注意:const对象必须初始化。由于const创建后不可更改,所以必须初始化。(定义一个不可修改的默认值完全无意义)const int i = get_size();//正确const int j = 1024;//正确const int k;原创 2017-07-29 20:29:30 · 923 阅读 · 1 评论 -
两个栈实现一个队列
栈:先进后出的一种数据结构。队列:先进先出的一种数据结构。此时如果我们先有一个栈是不够的,我们只能把先入栈的元素后出来,后面入栈的元素先出来。这是我们便想如何才能实现一个先进先出的结构呢。看下图:我们先把元素倒入S1栈中,在把S1栈中的元素逐个压栈到S2里面,再从S2出栈,即可达到先入栈的元素先出。此时我们可以有一个小优化,最后一个元素X1可不入S2减少一次压栈的操作。原创 2017-07-21 16:58:47 · 489 阅读 · 0 评论 -
【每日一题】替换字符串中的空格为$$$。要求时间复杂度为O(N)
题目:替换字符串中的空格为$$$。要求时间复杂度为O(N)例如:将"talk is cheap show me the code"替换。为"talk$$$is$$$cheap$$$show$$$me$$$the$$$code"。这道题类似和剑指offer一书中面试题4:替换空格思路是一样的。题目要求时间复杂度为O(N),而我们一般从前向后的思路时间复杂度为O(n^2),所以原创 2017-07-21 17:12:48 · 584 阅读 · 0 评论 -
两个队列实现一个栈
栈:先进后出队列:后进先出方法一:如何用两个队列实现一个栈呢?我们可以把一个队列里面的内容放入第二个队列里面,此时要剩余一个,这剩下的一个可以直接出栈,再把队列2里面的元素放回队列1, 重复即可达到栈的要求#include#include using namespace std;template class Cstack{public: Cstack(void)原创 2017-07-22 13:09:06 · 595 阅读 · 0 评论 -
【每日一题】实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
这道题有两种实现方式方法一:用两个栈来实现两个栈实现的主要思路是,一个栈存放数据,一个栈存放最小值。压栈操作:(1)我们先向S1压栈一个数据(2)再向S1压入第二个数据,如果此时栈S2为空,并且把需要压栈的元素data和S2的栈顶元素进行比较,如果此时需要压栈的元素小于等于S2栈顶元素,把元素也压入栈2,否则不用管出栈操作:判断S1栈顶元素与S2栈顶元素是否相等,相原创 2017-07-22 14:45:03 · 3392 阅读 · 0 评论 -
【每日一题】查找一个字符串中第一个只出现两次的字符。要求时间复杂度为O(N),空间复杂度为O(1)
题目:将"talk is cheap show me the code"替换。查找一个字符串中第一个只出现两次的字符。如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)本题我们很容易想到两次遍历,及外面一个大循环里面一个小循环直接遍历,可是题目要求时间复杂度为O(N),空间复杂度为O(1)。因此我们采用如下的方法解决。创原创 2017-07-22 16:04:34 · 1465 阅读 · 1 评论 -
关于阶乘的面试题总结
阶乘方面的题一直是我最近不太明白的点,因此我便总结了几个关于阶乘方面的面试题供探讨。面试题:一、给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。二、求N!的二进制表示中最低位1的位置。对于第一道题,一般人的思路会是想着求完N!之后再来看,此时就要考虑是不是溢出的问题,但是我们换一个思路想一想,想一下有什么数字相乘可以等原创 2017-07-22 21:24:07 · 1143 阅读 · 0 评论 -
两个集合用单链表存储,分别求出集合的差集和并集(单链表求差集并集)
一、集合求交集题目:已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。 例如,若集合A = { 5,10,20,15,25,30 },集合B = { 5,15,35,25 },完成计算后A = { 10,20,30 }。 链表结点的结构类型定义如下: struct node { int elem;原创 2017-08-01 12:39:00 · 7448 阅读 · 0 评论 -
C++中四种强制转换
一、简介C++中存在四种强制类型转换,分别是static_cast 、const_cast 、 dynamic_cast 、reinterpret_cast二、存在原因我们直到在C语言中有强制类型转换,可以转换成合理的类型,那么我们为什么要在C++中引入四种强制类型转化的概念呢? 由于新类型的强制类型转换可以提供更好的强制控制转换过程,一旦当程序员使用了四种强制类型转换,其他的人读程序的时原创 2017-11-24 17:07:29 · 1656 阅读 · 2 评论