自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 文件压缩

#pragma once#include <iostream>#include <vector>using namespace std;template<class T>class Greate//大堆{public: bool operator()(const T& left, const T& right)//仿函数,重载()大于 {  re...

2018-04-14 16:16:47 274

原创 数据结构(vector+list)

vector和list的使用vector为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高。在vecotor中插入或者删除某个元素,需要将现有元素进行复制,移动。如果vector中存储的对象很大,或者构造函数复杂,则在对现有元素进行拷贝时开销较大,因为拷贝对象要调用拷贝构造函数。对于简单的小对象,vector的效率优于list。vector在每次扩张容量的时候,将容量扩...

2018-02-28 15:18:54 854

原创 模板的类型萃取

初次接触类型萃取是在运用模板实现seqlist的时候,拷贝构造和赋值运算符重载时,单纯的使用memcopy(),函数进行拷贝,只是单纯的进行了浅拷贝,对于基本的数据类型是不会有任何错误的,但是如果是string类型时,单纯的值拷贝显然是不行的(超过了给定的buffer空间时),指向了同一块开辟的空间,然后析构时会出现问题。所以一开始直接调用赋值运算符的重载,这样显然不会出现问题,但是对基本的数据类...

2018-02-28 15:08:23 252

原创 字符函数串讲

1.模拟实现strncpy#include<stdio.h>  #include<assert.h>  #include<iostream>  char*my_strncpy(char*dest, const char*src, int n){ assert(dest != NULL); assert(src != NULL); int i = 0; char ...

2018-02-28 14:59:37 222

原创 指针下

1.总结指针部分的知识。一级指针、一维数组、数组指针一维数组的数组名就是指针,如int a[4]={0}; a就相当于一个指针 int *p=a。二级指针、二维数组、指针数组二维数组 int aa[2][3]={0}。这个时候是不能用int **pp=aa,但访问的时候应为**aa。实际上二维数组的第一维是int (*ab)[3],是个指针数组,不是数组指针。2.利用函数指针实现一个通用的冒泡排序...

2018-02-28 14:47:53 202

原创 指针2

//1.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 //找出这两个数字,编程实现。#include#include//找单独出现的数,一般方法void find(int arr[], int len){ int i, j, k; for (i = 0; i  {  k = 0;  for (j = 0; j   {   if (ar

2018-01-21 18:47:17 170

原创 main函数的可变参数列表

#include   #include   #include   int main(int argc, char *argv[]){ int sum = 0; int num1 = atoi(argv[2]); int num2 = atoi(argv[3]); if (strcmp(argv[1], "-a") == 0) {  sum = num1 +

2018-01-21 17:35:34 267

原创 智能指针

1.智能指针是RAII思想的一种产品,RAII:Resource Acquistion Is Initialization ,资源分配就初始化,定义一个类来封装资源的分配和释放。在构造函数里完成资源分配初始化,在析构函数里完成资源的清理。通常是经由类模板来实现。借由模板来达成泛型,通常借由类的析构函数来达成自动释放指针所指向的内存或对象。第一个阶段(C++98):auto_

2017-12-09 21:14:42 186

原创 Linux的基本开发工具

1.vim 和 emacs 都可以运行在终端,也有图形化的软件,非常适合快速编辑文件。当需要在无法运行图形界面的服务器上编辑代码的时候,二者也足以胜任。虽然在终端也有 nano 这样的编辑器,但毕竟 too simple ⚯,无法支撑较为复杂的编辑工作。这两个编辑器的默认配置的功能就已经很强大了,语法着色、补全、缩进等功能都很不错。为了实现强大的功能,vim 选择了多模式编辑(Normal,

2017-12-09 19:31:23 480

原创 多态与对象模型

1,什么是多态?同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 简单地概括为“一个接口,多种方法”。2.单继承和多继承的对象模型

2017-11-25 15:49:45 191

原创 Linux作业

进入目录需要哪些权限, 在目录中执行增删查(cd, touch, ls, rm, mv等)改文件动作, 需要哪些权限.rw 文件拥有者r--    本组用户r--   其他人r                   w                   - 读                 写                执行-  没权限Linux下的重要目录/pr

2017-11-25 14:40:50 741

原创 模板为什么不支持分离编译

如下图所示,在模板函数运行要经历预处理,编译,汇编,链接几个过程,前三个都没有问题,但是在链接时,因为是模板函数,没有实例化出代码,尽管生命了,却没有定义,所以不支持分离编译。解决办法一是显示实例化模板,二是将声明和定义放在同一个头文件中。

2017-11-18 19:59:37 311

原创 C++实现双向链表

#pragma oncetypedef int DataType;struct ListNode{ ListNode* _next; ListNode* _prev; DataType _data; ListNode(const DataType& x)  :_data(x)  ,_next(NULL)  ,_prev(NULL) {}};cla

2017-11-15 22:05:36 155

原创 C++实现顺序表和单链表

#pragma oncetypedef int DataType;class SeqList{public: SeqList()  :_a(NULL)  ,_size(0)  ,_capacity(0) {} // 拷贝构造 SeqList(const SeqList& s)  :_a(new DataType[s._size])  ,_size

2017-11-15 21:30:28 228

原创 菱形继承

1:分析菱形继承的问题     菱形继承是指一个基类A派生出两个派生类B,C,再有两个派生类B,C共同生成一个派生类D。由于D是继承B和C,而B和C又是继承自A,所以D中的_a不确定是来自B还是C,产生了二义性,因为B和C中的_a都是来自A,其实两个_a是一个,但是因为B和C各自继承,所以有两份,产生了数据冗余。2:剖析虚继承是怎么解决二义性和数据冗余

2017-11-05 14:56:21 288

原创 string的增删查改

#pragma once#include#includeusing namespace std;class String{public: String(const char* str = "")  :_size(strlen(str)) {  _capacity = _size;  _str = new char[_capacity + 1];  s

2017-10-31 22:35:51 316

原创 写时拷贝

写时拷贝:引入一个计数器,每片不同内容的空间上都由一个计数器组成,在构造第一个类指向时,计数器初始化为1,之后每次有新的类也指向同一片空间时,计数器++;在析构时判断该片空间对应计数器是否为1,为1则执行清理工作,大于1则计数器-1。如果有需要进行增删等操作时,再拷贝空间完成,有利于提高效率。#includeusing namespace std;class Strin

2017-10-30 10:30:46 238

原创 复杂链表的复制及测试

#includeusing namespace std;typedef struct ComplexNode{ int _data; struct ComplexNode*  _next; struct ComplexNode* _random;}ComplexNode;ComplexNode* BuyNode(int data){ ComplexNode*

2017-10-30 10:13:18 232

原创 完成日期类的实现

#include#include#includeusing namespace std;class  Date{public: Date(int year = 1990,int month = 1,int day = 1) {  _year = year;  _month = month;  _day = day; } Date(const Da

2017-10-25 11:26:52 257

原创 递归

#include#include#include//编写一个函数实现n^k,使用递归实现int Kfactorial(int n){ if (n   return 1; else  return n*Kfactorial(n - 1);}int main(){ printf("%d\n", Kfactorial(7)); return 0;

2017-10-24 21:26:53 199

原创 string深拷贝的传统与现代写法

#includeusing namespace std;//1.传统写法完成String深拷贝。class String{ friend ostream& operatorpublic: //构造函数 String(char*str = "")  :_str(new char[strlen(str) + 1]) {  strcpy(_str, str);

2017-10-23 09:44:57 530

原创 C++动态内存管理

1.malloc/free与new/delete的联系和区别:(1).他们都是动态管理内存的入口。(2).malloc/free是C/C++标准库的函数,new/delete是C++操作符。(3).malloc/free只是动态分配内存空间/释放空间,new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理。(4).malloc/free需要手动计算类型大小且返回

2017-10-22 09:02:56 180

原创 函数栈帧

2017-10-19 17:14:08 210

原创 拷贝构造中的N中调用情况

1.C++对传参时要生成一个临时变量,调用一次构造函数,再调用一次拷贝构造函数将临时变量复制给实参,也就是传参过程至少调用一次构造函数和一次拷贝构造函数。对于传引用时,编译器会自动优化,不需生成临时变量,因为形参出了作用域还存在,所以不需要调用拷贝构造函数,如果还有赋值运算,编译器将拷贝构造和赋值运算合并为一步。2.Test1中调用了__1_次AA的拷贝构造函数,_1__次AA的赋值运算符函数

2017-10-19 13:32:12 209

原创 考试编程题

#include#include#include#include#includevoid bit_set(unsigned char* p_data, unsigned char pos, int flag){ assert(p_data != NULL); assert((pos >= 1) && (pos  if (flag == 1) {  *p_

2017-10-17 14:02:28 423

原创 四个默认成员函数和重载运算符

1.类和对象的基础知识:类实际上是对某种类型的对象变量和方法的原型,类是从一些具有相同属性或功能的具体实例,抽象出共有的一些属性的,自定义抽象数据类型。public成员可从类外部直接访问,private/protected不能从类外部直接访问,每个限定符在类体中可以使用多次,类体中如果没有定义限定符,则默认为私有的,类的访问限定符体现了面向对象的封装性。结构体内存对其规则:(1).第一

2017-10-12 15:08:53 322

原创 C++入门基础知识

1.命名空间:也叫名字空间,名字空间域是随着标准C++引入的,相当于一个更加灵活地文件域(全局域),可以用花括号把文件的一部分括起来,并有关键字namespace开头给它起一个名字。名字空间域解决全局命名冲突的问题。2.C++基本的输入输出流:cin:标准输入流对象,键盘为其对应的标准设备。cout:标准输出流对象,显示器为标准设备。cerr和clog:标准错误输出流,输出设备是显

2017-10-12 13:56:39 158

原创 c语言实现单链表面试题之进阶篇

1.判断一个单链表是否带环:定义一个指针fast,另一个指针slow,两个指针同时从链表头开始往后走,若相遇,则表示单链表带环,否则,不带环。若带环,两个指针必会相遇,相遇之后再让slow指针走,再次回到相遇节点时走过的长度便是环的长度。假设链表头到入口点的长度为a,环的长度为b,入口点和相遇点的长度为c,因为slow一次走一步,fast指针一次走两步,如果a远大于b,则fast指针需要走n圈才能

2017-10-09 19:32:51 302

原创 单链表面试题——基础篇

顺序表和链表的优缺点1:顺序表可以进行随机访问,链表不行。2:顺序表尾插效率高,头插(删)或者中间位置插入(删除)时链表效率更高。3:顺序表的CPU高速缓存利用率高,链表的CPU高速缓存利用率低。顺序表和链表的适用场景    适用于需要大量访问元素的 而少量增添/删除元素的程序;   适用于需要进行大量增添/删除元素操作 而对访问元素无要求的程序。#

2017-09-23 20:00:50 186

原创 单链表

#pragma oncetypedef int DataType;typedef struct Node{ DataType data; struct Node* next;}Node;void PrintList(Node* pHead);void PushBack(Node** ppHead, DataType x);void PopBack(Node**

2017-09-23 19:55:48 143

原创 顺序表

#includetypedef int DataType;#define N 100typedef  struct SeqList{ DataType array[N]; size_t size;}SeqList;void InitSeqList(SeqList* s);void PrintSeqList(SeqList* s);void PushBack(

2017-09-13 21:41:39 160

原创 预处理

#include#include#define MAX(x,y) ((x)>(y)?(x):(y))int main(){  int a = 10;  int b = 20;  int max = 0;  max = MAX(a,b);  printf("max = %d\n",max);  system("pause");  return 0;}

2017-08-29 15:32:41 470

原创 数组作业

一维数组创建:type_t arr_name[const_n]  // type_t是指数组的元素类型,const_n是常量表达式,指定数组大小例如:  int arr[10];一维数组的初始化:创建数组时同时给数组内容一些合理初始值例如: int arr[10] = {1,2,3,4,5};             char ch[] = "abc";一维数组的使用:#i

2017-08-06 23:15:36 470

原创 第七次作业

//      乘法口诀表      //#include#includevoid Mul(int input ){   int i = 0;   for(i=1;i   {      int j = 0; for(j=1;j { printf("%2d * %2d =%3d ",j,i,j*i); } printf("\n");   }

2017-08-06 20:53:05 190

原创 memcpy和memmove的模拟实现

//      memcpy     //#include#include#includevoid* my_memcpy(void*dest,const void*src,int count){  void*ret = dest;  assert(dest!=NULL);  assert(dest!=NULL);  while(count--)  { 

2017-08-02 23:41:25 226

原创 strstr函数模拟实现

#include#include#includechar* my_strstr(const char*str1,const char*str2){    char*cp1 = (char*)str1;char*cp2 = (char*)str2;char*str = NULL;assert(str1!=NULL);assert(str2!=NULL);if(

2017-08-02 23:29:09 218

原创 strcpy等函数的模拟实现

//   my_strcpy#include#include#includechar* my_strcpy(char*dest,const char*src){char*ret = dest;assert(dest!=NULL);assert(src!=NULL);     while(*dest++ = *src++){  ;}

2017-07-30 22:53:02 226

原创 strlen的三种实现方式

#include#include#includeint my_strlen(const char*str){   //1.指针-指针const char*start=str;assert(str!=NULL);     while(*str++)     ;return str-start-1;//2.计数器int count = 0;assert(

2017-07-30 22:26:39 477

原创 扫雷的简单实现

//  test.h#ifndef __GAME_H__#define __GAME_H__#include#include#include#include#define DEFAULT_COUNT 10#define ROW 10#define COL 10#define ROWS (ROW+2)#define COLS (COL+2)void I

2017-07-30 21:20:20 226

原创 三子棋的简单实现

//   tset.h#ifndef __GAME_H__#define __GAME_H__#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#define ROW 3#define COL 3void Display(char arr[ROW][COL],int row,int

2017-07-30 21:14:54 339

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除