C、C ++
C语言、C++语言笔记
困得睁不开眼
引发思考是一种高水准的审美调动
展开
-
解决哈希冲突的方法,Hash的介绍,散列因子的介绍
哈希 哈希算法理解为一种将很大的数据块经过哈希计算,用一个很小的字符串来标识这个很大的数据块 对应的<key,value>模型 key表示计算的哈希值,value表示存放的数值 对应可以实现 key = func(value) 的函数称为哈希函数一般情况都是采用value % length计算哈希值 很明显的一般的数据结构不会太大,这样计算的哈希值...原创 2018-08-31 13:31:46 · 3512 阅读 · 0 评论 -
打印100到200之间的素数,打印9*9乘法口诀,判断1000年到2000年之间的闰年
//1,打印100到200之间的素数#define _CRT_SECURE_NO_WARNINGS 1#include #include int main(){ int i = 0, j = 0,count=0; printf("100到200之间的素数有:\n"); for (i = 101; i <= 200; i+=2) { int k = (int)(sqrt)(i*原创 2017-09-28 23:18:57 · 416 阅读 · 0 评论 -
基于哈希的海量数据处理
基于哈希表给出以下问题的解决方案:1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 解:用哈希文件切分的方法将该文件切分为1000份。再进行处理。将该文件先分1000次访问,每次访问时依次将所访问的IP地址用哈希函数进行计算其哈希值,因为再次要将其切分为1000份,所以用计算得到的哈希值对1000进行取模,取模得到0的放的0...原创 2018-03-21 10:54:57 · 410 阅读 · 0 评论 -
C++中的引用
今天整理了一下关于C++中引用的用法一、简单介绍观察以下代码#include <iostream> using namespace std; in...原创 2018-03-13 18:54:03 · 459 阅读 · 0 评论 -
如何理解面向对象的封装、继承、多态
如何理解面向对象的封装、继承、多态面向对象可以说是一种对现实是事物的抽象,将一类事物抽象成一个类,类里面包含了这类事物具有的公共部分,以及我们对这些部分的操作,也就是对应的数据和过程。面向对象思想的三大特性,我们应该如理解呢?封装 在面向对象思想中,对一个类,将数据和过程封包围起来,对外隐藏具体的实现细节 并且数据(成员变量和成员函数)在内部是完全自由使用的,而外部对...原创 2018-08-09 21:59:54 · 7979 阅读 · 1 评论 -
函数重载
一、一个简单的C++程序#include<iostream>using namespace std;int main(){ cout << "Hello world" << endl; return0;} 首先我们注意到,相较于C语言程序,C++程序在头文件下面多了一行using namespace std;这句话的意思...原创 2018-03-12 08:24:19 · 433 阅读 · 0 评论 -
判断二叉树棵树是否为搜索二叉树
利用搜索二叉树的特性,中序遍历结果为一个无重复数据的升序序列 则先将这颗二叉树采用中序遍历结果保存在vector中 然后遍历vector,判断是否满足是升序并且无重复数据,不满足则不是搜索二叉树,反之则是搜索二叉树。 时间复杂度为O(N) 空间复杂度为O(N)代码如下:/** * Definition for binary tree * struct TreeNode {...原创 2018-07-01 21:59:27 · 1055 阅读 · 0 评论 -
C++对象模型(上)单继承
探索对象模型先看一个例子:class Base{public: virtual void func_1() {} virtual void func_2() {}protected: int _a;};int main(){ Base b1; Base b2; system("pause"...原创 2018-05-04 09:52:15 · 188 阅读 · 0 评论 -
C++中异常处理的使用
对错误的处理最普遍的是采用返回错误码的形式,但是由于对错误信息的报告不是很明显,或者是只能在本层进行处理这个错误。iclude include include using namespace std;int main(){ FILE * fd=fopen(“test.txt”,”r”); if(fd==NULL) { cou...原创 2018-06-26 21:59:03 · 812 阅读 · 0 评论 -
C++中为什么建议使用初始化列表
什么是初始化列表,来看下面代码,我们有一个日期类对象 我们可以这样来定义构造函数:class Date ...原创 2018-07-05 21:59:56 · 2602 阅读 · 0 评论 -
一起聊项目
new 和 malloc 的区别属性 1. new 是 C++ 中的操作符,malloc 是C 语言中的函数 参数 2. new 不用传所开辟空间的大小,编译器会自行根据类型计算大小,malloc 需要我们自己自己计算开辟空间的大小(以字节为单位) 成功时返回值 3. new 调用成功返回对象类型的指针,malloc 调用成功返回的是 void* 还需要我们自己进行转换 错...原创 2018-08-09 21:59:38 · 343 阅读 · 0 评论 -
为什么要进行结构体内存对齐
结构体内存对齐什么是结构体内存对齐结构体不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限于读取内存的要求,而是每个成员在内存中的存储都要按照一定偏移量来存储,根据类型的不同,每个成员都要按照一定的对齐数进行对齐存储,最后整个结构体的大小也要按照一定的对齐数进行对齐。对齐规则:第一个成员在与结构体变量偏移量为0的地址其他成员变量要对齐...原创 2018-08-10 21:59:12 · 9833 阅读 · 8 评论 -
C++11初了解
C++11初认识(1)初始化void test(){ vector&amp;amp;lt;int&amp;amp;gt; v1{1, 2, 3, 4, 5, 6 }; for(int i = 0; i &amp;amp;lt; v1.size(); ++i) { cout&amp;amp;lt;&amp;amp;lt;v1[i]&amp;amp;lt;&am原创 2018-08-31 13:27:59 · 1184 阅读 · 0 评论 -
单例模式--含义是某一个类,在一个进程中只有唯一的一个对象
单例模式表示的含义是在某一个类,在一个进程中只有唯一的一个对象 并且在语法角度上进行制约 单例模式是一种设计模式,设计模式可以理解为经典问题场景下的经典解决方案。(方案一)简易版本 对象定义后数据立即加载到内存 (饿汉模式)(方案二)对象定义出来 先不着急加载到内存,等到第一次使用的时候,再将数据加载到内存 (懒汉模式)饿汉模式#include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;st原创 2018-06-19 21:59:32 · 2692 阅读 · 5 评论 -
list之进阶篇
自己模拟实现的listmy_list.cpp#include &lt;stdio.h&gt;#include &lt;assert.h&gt;#include &lt;iostream&gt;using namespace std;//模拟实现list(双向带头节点链表)//定义一个List节点template&lt;class T&gt;struct原创 2018-06-18 21:59:19 · 578 阅读 · 0 评论 -
C++中的函数模板,类模板
看一个我们经常用到的一个交换函数:void Swap(int * a,int * b) { int tmp=*a; ...原创 2018-05-12 19:23:36 · 307 阅读 · 0 评论 -
C++中继承,隐藏(重定义),切片行为
继承继承是面向对象复用的重要手段,继承是类型之间的关系建模,部分实现共享,并且实现各自本质不同的东西。一.继承方式和访问限定符的关系三种继承关系:public://共有private://私有 protected://保护 三种访问限定符:public://共有继承private://私有继承 protected://保护继承两者之间...原创 2018-04-27 09:52:19 · 420 阅读 · 0 评论 -
C++对象模型(中)多继承
上一篇介绍了单继承体系中的对象模型:请戳:点击打开链接 多继承体系下的对象模型 一、简单多继承例如下面代码:class B{public: virtual void func_1()//虚函数 { cout << "B ::func_1()\n"; } virtual void func_2()//虚函数 { cout <&l...原创 2018-05-04 12:44:16 · 270 阅读 · 0 评论 -
C++多继承,菱形继承,虚继承 ,虚基表和虚基表指针
多继承当一个子类只有一个直接父类时,称这个继承关系为单继承当一个子类有两个或两个以上的直接父类时,称这个继承关系为多继承当存在多继承时,就有可能形成这样一种继承关系我们称上面的继承关系为菱形继承,来看看菱形继承如何实现 class Person{public: Person(const string name = "") :_name(name) {...原创 2018-05-04 11:49:24 · 1332 阅读 · 0 评论 -
C++中的多态
多态一、概念理解要想理解C++中的多态,首先要理解虚函数在类的成员函数前面加virtual关键字修饰,则这个成员函数 称为虚函数 当在这个类的派生类中也定义了一个完全相同的虚函数时,则称这个函数重写(覆盖)了基类的中的虚函数如下面的这段代码:#include <stdio.h>#include <iostream>#include <windows.h>u...原创 2018-05-04 09:13:19 · 196 阅读 · 1 评论 -
求1+2+3+...+N 不可以使用 * / 和循环 模板的偏特化和全特化
看到这个题,不考虑限定条件,我们可能会有两个方向1.一个就是用等差数列公式m=n(n+1)/2直接就可以求出来了2.用循环实现但是上面都限定了。所以我们就要想办法了我们知道,多数情况下,循环和递归是可以转换的那么有这样一种最基本方法,我们用递归实现#include <stdio.h>#include <iostream>using nam...原创 2018-05-16 23:43:45 · 176 阅读 · 0 评论 -
如何构造一个不能被继承的类
一.实现一个不能被继承的类 拿到这个题,思考这个类不能被继承说明这个类的派生类是不能被构造出来的,我们就可以从构造函数下手。 子类对象要是想被创建出来,那么就一定会调用自己的构造函数,而且自己的构造函数是由父类的构造函数合成的,如果把父类的构造函数限定为私有的,无论是哪种继承方式,对子类都是不可见,那么子类对象就不能被构造出来了。这样就达到了不能被继承。 但是如果父类的构造函...原创 2018-04-25 20:58:22 · 645 阅读 · 0 评论 -
动态内存开辟C语言和C++,new与delete,malloc和free,operator new 和operator delete
动态内存开辟C语言中有三个动态开辟空间的函数1.mallocvoid* malloc (size_t size);开辟size个字节大小的内存,并返回所开辟空间的起始地址2.callocvoid* calloc (size_t num, size_t size);开辟num个大小为size的内存并将里面的值都初始化为0,再返回所开辟空间的起始地址3.r...原创 2018-04-04 10:49:59 · 973 阅读 · 0 评论 -
C++中的模板不支持分离编译
C++中的模板不支持分离编译 按照我们之前的习惯,写出的代码是这样的// Template.h#pragma once#include <stdio.h>#include <iostream>using namespace std;int Add(int a,int b);//对普通函数的声明template<class T>...原创 2018-05-18 21:48:37 · 560 阅读 · 0 评论 -
C++中的异常处理
对错误的处理最普遍的是采用返回错误码的形式,但是由于对错误信息的报告不是很明显,或者是只能在本层进行处理这个错误。#iclude <stdio.h>#include <iostream>#include <errno>using namespace std;int main(){FILE * fd=fopen("test.txt","r"...原创 2018-05-26 18:00:09 · 275 阅读 · 0 评论 -
模拟实现vector之进阶篇
在我们了使用了库里面的vector后,我们来模拟实现MyVector 之前有关库里面的vector是如何使用的:原创 2018-06-18 21:59:11 · 686 阅读 · 1 评论 -
为什么C++中的模板不支持分离编译
C++中的模板不支持分离编译按照我们之前的习惯,写出的代码是这样的// Template.h#pragma once#include &lt;stdio.h&gt;#include &lt;iostream&gt;using namespace std;int Add(int a,int b);//对普通函数的声明template&lt;class T&gt;T S...原创 2018-06-18 13:02:28 · 635 阅读 · 0 评论 -
模拟实现vector和list 并用list适配出栈,用vector适配出队列
您要的代码已经备好,请准备查收,——————-MyVector的实现#pragma once#include &lt;stdio.h&gt;#include &lt;string&gt;#include &lt;string.h&gt;#include &lt;stdlib.h&gt;#include &lt;assert.h&原创 2018-06-18 12:41:33 · 413 阅读 · 1 评论 -
C++容器------vector 的扩容函数使用篇
C++SLTL中六大组建中的容器是很重要的一部分的 而容器中的vector也是工作中经常用的 先来模仿库里面的vector实现一个自己的Vector:template &amp;amp;amp;amp;lt;class T&amp;amp;amp;amp;gt;class Vector{public: Vector():_start(NULL),_finish(NULL),_endOfstorage(NULL) {} ~V...原创 2018-06-16 21:59:57 · 5472 阅读 · 2 评论 -
STL六大组建-----初始
在前面两篇中介绍了线程的基本概念和线程控制 今天来看一下线程之间的同步和互斥关系互斥关系线程之间的互斥关系 对于一块临界资源,同一时间只能有一个线程进行访问,对于之前学习的进程间通信中讲的管道和消息队列,均内置的互斥同步机制。大部分情况下,线程使用的函数都是全局的,如果这样的话,就可能发生当一个线程正在访问一资源时,另外一个线程也来访问该资源,此时就可能发生逻辑错误。经典场...原创 2018-06-21 21:59:10 · 567 阅读 · 0 评论 -
智能指针--标准库里的实现 scoped_ptr,share_ptr
在之前介绍了我们自己实现的ScopPtr和SharePtr,今天来看一下库里面的智能指针的实现由于历史原因,C++98中只实现了auto_ptrm而且还不好用,所以就有大佬们自己实现了share_ptr scoped_ptr 包含于第三方boost库中,而且还被大家广泛使用。所以在新的标准C++11中引用了boost库中智能指针的用法,只是将其稍作修改将scoped_ptr重新定义为uniqu...原创 2018-06-06 21:53:32 · 454 阅读 · 0 评论 -
迭代器失效问题
在前面我们实现了vector和list 不管是库里面的使用 还是我们自己模拟实现的版本 今天来看一个关于容器,容易出现的问题,迭代器失效问题 如果我们有如下要求,在一个list中,我们要求只将节点内容为偶数的节点删除掉。 我们就实现如下代码:void test_iterator_invalid(){ list&amp;amp;amp;amp;lt;int&amp;amp;amp;amp;gt; L; L.push_back(1);...原创 2018-06-20 21:59:06 · 1325 阅读 · 1 评论 -
智能指针--SharePtr ScopedPtr
在上一篇中介绍了auto_ptr的实现,我们说那是一种不太好的实现方法,其实主要就是在解决拷贝构造所带来的问题,既然这样的话,有人就有了一种方法,既然拷贝会出现各种问题,那么我禁止拷贝!scoped_ptr的实现就是一种防拷贝的机制。scoped(作用域的意思)1.只声明不定义2.声明为私有的,让在类外也没有办法定义下面是模拟库里的scoped_ptr的实现如下代码:...原创 2018-06-06 21:53:45 · 304 阅读 · 0 评论 -
智能指针--AutoPtr
在上一篇中简单介绍了C++中的异常机制,我们了解到异常会导致执行流的乱跳现象,这样的话就会引起一些问题,如下:#include <iostream>#include <stdio.h>#include <vector>using namespace std;void func(){ int *p1=new int[10]; ...原创 2018-06-06 21:53:14 · 262 阅读 · 0 评论 -
C++中的初始化列表、const修饰的成员、友元类和友元函数、内联函数、static成员、构造函数的优化
我的c++笔记整理初始化列表 初始化列表以一个冒号开始,每个数据列表以逗号隔开。 一、初始化列表可以提高效率 ,尽量使用初始化列表初始化列表不论你写还是不写,系统都会自己调用的从下面的单步调试过程可以看出来,Date类成员变量中有一个自定义类型Time时间类,Date日期类的构造函数调完我们自己写的初始化列表后,并不是就执行函数体,而是去调Time的构造函数,从而对自己...原创 2018-03-31 14:50:44 · 440 阅读 · 0 评论