c/c++
是谁在许愿瓶里写满了悲哀
绳可锯木断,水可滴石穿。
展开
-
堆排序--topk问题
求TopK问题—堆排序问题:求一个N个元素的数组中前K大的数,或者前K小的数、解决思路:使用堆排序;求前K大的数----建小堆:首先从数组的前K个数中构建一个小堆,堆顶的元素就是K个数中的最小值,然后将后面N-K个元素依次和堆顶元素比较,如果大于堆顶的值就替换堆顶元素。这样遍历后就找到了前K个值。求前K小的数—建大堆:从数组前K个中建大堆,堆顶的元素是目前的最大值,然后用其余N-K个元素和堆顶的元素比较,比堆顶元素小的替换,然后调整堆。void adjustDown(int* a, int par原创 2022-01-12 14:54:08 · 248 阅读 · 0 评论 -
set的使用
set和map底层都是由红黑树实现的,每个元素都是红黑树的一个个节点;只不过map是key-value模型,每个节点是key—>value(映射)关系;而set是key模型,每个元素只有一个键值(key),同时也是实值(value),同时也不允许有相同的键值,默认按照升序排列,所以set的用法和map差不多。set的定义:set<K> s1;set<K>...原创 2018-05-17 08:33:40 · 259 阅读 · 0 评论 -
map的使用
我们经常使用过顺序容器如vector,list,queue,deque等,顺序容器是按照元素的插入顺序来存储元素;关联式容器如map,set,multimap,multiset等,这些容器是按照元素的关键字来保存的。 下图是《c++Primer》中的介绍: map和set的底层实现的数据结构:—红黑树 所以mapmap中存放的元素实pair,同时用有键值(Key)和实值(valu...原创 2018-05-16 17:33:15 · 286 阅读 · 0 评论 -
智能指针
什么是智能指针? 智能指针就是智能(自动)的管理所指向的的内存资源的释放。因为我们自己开辟内存后,使用普通指针的时候最后常常忘了释放资源,导致内存泄漏! 智能指针本身并不是一个指针,他是一个类,重载了“ * ” “->“,能让我们像指针一 样去使用,最核心的思想就是RAII机制:获得资源立即初始化。定义一个类,在构造函数中实现资源的分配和初始化,析构函数中释放资源。这样一来,对象出了作用...原创 2018-06-04 02:27:51 · 706 阅读 · 0 评论 -
小青蛙走迷宫的问题
小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距离需要消耗1点体...原创 2018-07-30 09:12:37 · 715 阅读 · 0 评论 -
关于指针释放问题
看个例子:void test(){ char* str = (char*)malloc(10); strcpy(str,"hello"); free(str); if(str != NULL) { strcpy(str,"world"); printf("%s\n",str); }}运行test()会怎样?...原创 2018-09-13 21:52:48 · 1169 阅读 · 0 评论 -
实现一个字符串缓冲区---【VIPKID面试题】
和面试官聊到内存管理的问题,然后让我实现一个字符串缓冲区的类,想到了思路,但是最后写出来的代码实在跟shi一样;凉凉了!!!、、、、、、、、、、、、、、、、、以下是实现一个字符串缓冲区的类;实现的不好,请大家指正!、、、、、、、、、、、、、、、、、#define _CRT_SECURE_NO_DEPRECATE 1#include<stdio.h>#include<...原创 2018-09-30 00:54:03 · 683 阅读 · 0 评论 -
逆置单链表的部分区间---【VIPKID面试题】
给一个带头节点head的单链表,给定start和end两个位置,将这个区间内置。。。思路:就是链表的逆置;先将区间内的逆置,再处理start和end的位置两种情况:start是头结点时,要将链表的头结点head更新为end;start不是头结点是正常处理;(还是自己太菜了。。。。面试的时候先去处理start和endl了,导致后面没有处理好,,凉凉啊~~)不说了,贴上代码:void...原创 2018-09-30 16:03:32 · 345 阅读 · 1 评论 -
C++实现单例模式
单例模式**应用场景:**在某个服务器程序中,该服务器的配置信息放在一个文件中,这些配置数据由一个单例对象同一读取,然后在进程中的其他对象通过这个单例模式对象获取配置信息。方便,简化在复杂化境下的配置管理。什么是单例模式?一个类仅有一个实例化的对象,并且提供一个访问它的全局访问点,这个实例对象呗所有程序模块共享。两个要求:该类不能被复制不能被公开的构造所以:拷贝构造,赋值函数都不能...原创 2018-10-17 00:23:30 · 449 阅读 · 0 评论 -
基于POSIX实现一个文件下载线程池
先理清思路:线程池需要维护一个任务队列,允许配置活动的线程数,线程池从任务队列中取任务,根据拿到的任务执行响应处理,所以每个任务是这样一个结构体:typedef void* (*FUNC_POINT)(void* arg); //定义一个函数指针typedef struct Task //任务结构体,{ //void* (*Handler)(void* arg); //处理任务...原创 2019-07-25 17:32:34 · 171 阅读 · 0 评论 -
lambda表达式,bind函数
什么是lambda表达式?:一块代码单元,可以理解为未命名的内联函数。形式:【捕获列表】(参数列表)->返回类型 { 表达式体 }例子:[ ](const string& s1, const string& s2){ return s1.size() < s2.size()};可以省略参数列表和返回类型,但是必须包括捕获列表和表达式体auto f = [ ]...原创 2019-08-14 19:18:57 · 323 阅读 · 0 评论 -
使用IShellLink和IPersistFile在windows下创建文件快捷方式
转载:http://www.cnblogs.com/lzjsky/archive/2011/01/17/1937525.html二个操作:新建和解析主要用到的是COM组件。IShellLink和IPersistFile需要添加的头函数#include <shobjidl.h>IPersistFile主要用到两个成员函数:1、Save。保存内容到文件中去2、Load。读取...原创 2019-08-12 12:51:35 · 993 阅读 · 0 评论 -
VS解决“This function or variable may be unsafe” 错误
在用VS2017打开项目时,发现报错:error C4996: ‘strncpy’: This function or variable may be unsafe.原因是由于VS2017要求更加严格,本处的报错是由于使用了strncpy函数,该函数将被微软弃用,微软建议用strncpy_s来代替。解决方法:点击:项目->XXXX属性->C/C+±>预处理器->预...转载 2019-08-12 14:42:54 · 2687 阅读 · 0 评论 -
浅识:【C++11】右值引用
引入右值引用的目的:为了支持移动操作和完美转发。目的:解决临时对象的问题,提高效率。区分左值和右值:左值跟右值都是针对表达式而言的; 左值:指表达式结束后依然存在的持久对象,变量是左值。 右值:指表达式结束时就不再存在的临时对象,右值是可以取出地址的,要么是字面常量,要么是表达式求值过程中创建的临时对象。 左值持久,右值短暂例子:对于int a = 10;++a和a++的...原创 2018-04-14 21:16:19 · 819 阅读 · 0 评论 -
list的使用
List是将元素按顺序存储在链表中,与vector的使用很类似,但是它比vector能更为方便的插入和删除。但是随机访问时比较慢的。【文件包含】#include<list>using namespace std;注意:list它是双向链表 【list操作】 一:初始化list <int> l1;//对象l1的size=0list <int> l2(5);//对象l2的size=5,元素是0(原创 2017-09-05 20:55:18 · 238 阅读 · 0 评论 -
vector的使用
vectorvector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。【文件包含】 1,头文件#include<vector> 2,加上using namespa原创 2017-09-03 19:28:33 · 312 阅读 · 0 评论 -
【c++】(初识)继承
继承概念: 继承机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,成为派生类。继承呈现了面向对象程序设计的层次结构。 定义格式: 例子:#include<iostream>using namespace std;class Base//创建父类{public: Base() {原创 2017-04-06 23:25:24 · 197 阅读 · 0 评论 -
free和delete区别
free和mall匹配:释放malloc出来动态内存; delete和new匹配:释放new出来的动态内存空间。 1, malloc/free是c/c++标准库的函数,new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理(清理成员)。 2, malloc/free需要手动计算类型大小且返回值是void*,new/delete可以自己计算类型大小,返回对应的指针。原创 2017-03-30 12:41:07 · 8410 阅读 · 0 评论 -
【c++】(初识)多态
首先什么是多态? 多态—->字面意思就是多种形态。在面向对象语言中,接口的多种不同实现方式即为多态! 在c++中也是如此,同一操作作用于不同的对象可以有不同的解释,有不同的结果。在运行时可以通过指向基类的指针,来调用实现派生类中的方法。 在c++中实现多态的方法:虚函数,抽象类,覆盖,模板(注意:重载和多态无关!) 对象类型: 例子: 静态分类:1,静态多态(函数重载,泛型编程)2原创 2017-04-10 13:10:30 · 209 阅读 · 0 评论 -
【c++】虚函数和虚表
什么是虚函数? 在某基类中声明为virtual并在一个或者多个派生类中重新定义的成员函数。实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖函数。 用法格式: virtual 函数返回类型 函数名 (参数){函数体}。class A{public: void print() { cout << "this is A!" << endl;原创 2017-04-10 22:40:23 · 404 阅读 · 0 评论 -
【c++】模板和模板类
C++是一种“强类型”语言。也就是说,对于一个变量,编译器必须确切知道它是什么类型。但是,这种强类型函数在实现一些简单函数反而更麻烦。例如:求两大数的较大者,应以Max( )函数,我们需要对不同数据类型分别定义不同重载版本来实现:int Max(int x,int y) //比较两个int类型的值{ return ((x > y) ? x : y);}float Max(原创 2017-05-05 12:57:01 · 285 阅读 · 0 评论 -
【c++】c++的基础知识
命名空间 在c++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将存在于全局命名空间中,会导致很多冲突,使用命空间的目的就是对标示符的名称本地化,以避免命名冲突或名字污染,namespace关键字就是针对这种问题的。 这种情况一般来说是不允许的,会导致编译错误,命名冲突。void f(){ int a = 10; int a = 20;}命名空间的定义:name原创 2017-06-19 11:52:53 · 892 阅读 · 0 评论 -
【c++】类和对象--四个默认成员函数+运算符重载
累的声明和定义 c++中类的定义一般分为类的声明部分和类的实现部分。类的声明部分用来说明该类中的成员(数据成员,成员函数),告诉使用者“干什么”。类的实现部分用来定义成员函数,该函数用来对数据成员进行操作,告诉使用者“怎么做”。 类定义的形式:class <类名>{ public: <成员函数或者数据成员的说明> protected: <成员函数或者数据成员的说原创 2017-06-27 15:02:04 · 515 阅读 · 0 评论 -
C/C++动态内存管理
c语言中用malloc/calloc/realloc/free进行动态内存管理,malloc/calloc/realloc用来在堆上开辟空间,free将申请的空间释放掉。 当一个程序需要内存的时候,它就调用malloc函数,malloc函数从内存池中提取一块何时内存,并向改程序返回一个指向这块内存的指针(此时这块内存没有被初始化!)。 函数原型: void * malloc(size_t si原创 2017-07-20 12:52:47 · 255 阅读 · 0 评论 -
【c++】构造拷贝构造的N种调用情况问题
C++对传参和传返回值时构造的优化处理; 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象 C++中的返回值优化 返回值优化(Return Value Optimization,简称RVO),是这么一种优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象用户返回,那么这个临时对象会消耗一个构造函数(Constru原创 2017-07-20 23:10:08 · 212 阅读 · 0 评论 -
【c++】菱形继承
【单继承】:一个子类只有一个直接的父类的继承关系 【多继承】:一个子类有两个或者两个以上的直接父类的继承关系 【菱形继承】: class A{public: void fun() { cout << "A::fun()" << endl; } int _a;//sizeof(A) = 4};class B :public A{public:原创 2017-07-30 14:58:39 · 326 阅读 · 0 评论 -
【c++】深浅拷贝,引用计数写时拷贝
什么是浅拷贝? 例如下面的代码,:class AA{private: int* _a = new int[2];};int main(void){ AA a1; AA a2(a1); system("pause"); return 0;} 我们看到对象a1和a2地址一样,指向同一块空间 当类中的成员变量包括指针时,而又没有定义自己的拷贝构造函原创 2017-07-22 20:40:32 · 426 阅读 · 0 评论 -
【c++】模板为什么不支持分离编译
我们在写代码的时候,通常情况下我们定义.h文件.cpp。我们把函数的声明放在.h文件中,函数定义放在.cpp中。 【什么是分离编译】 分离编译模式是指:一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件连接起来形成单一的可执行文件的过程。//Test.hvoid fun();//函数声明//Test.cpp#include"Test,h"void原创 2017-08-08 13:00:18 · 285 阅读 · 0 评论 -
关键字new与malloc函数
new “是c++的一个关键字,同时也是操作符。 new进行内存管理: new的过程: 当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间,调用构造函数,返回正确的指针。如果我们创建的是简单类型的变量,那么第二步会被省略。 例如我们创建一个简单类:class A{ int i; public: A(int _i):原创 2017-03-28 22:23:52 · 461 阅读 · 0 评论