
c/c++
文章平均质量分 59
月已满西楼
某不知名学校毕业学生,某不知名名企软件工程师,擅长C++
python,Mysql
展开
-
面试官都在问 | 请谈谈vector的底层实现
名企高频考点之-请谈谈vector的底层实现0. 概述STL版本比较多,第一个STL是在惠普实验室完成的,简称HP版本,后序版本STL都是基于HP版本给出来的,大同小异,本文主要基于SGI-STL版本进行探究,linux下采用就是SGI-STL,而且该版本的命名风格以及编码风格,可读性非常高。1. vector的底层结构vector底层实际是泛型的动态类型顺序表,因此其底层实际是一段连续的空间。在SGI-STL的vector中,实际在底层使用三个指针指向该段连续空间的,如下:start指向空间的原创 2021-03-04 11:55:24 · 4240 阅读 · 1 评论 -
经常弹出的404页面是什么东西?
404 (HTTP状态码) HTTP 404或Not Found错误信息是HTTP的其中一种“标准回应信息”(HTTP状态码),此信息代表客户端在浏览网页时,服务器无法正常提供信息,或是服务器无法回应且不知原因。 1. 影响 自定义404错误页面是增强用户体验的很好的做法,但在应用过程中往往并未注意到对搜索引擎的影响,譬如:错误的服务器端配置导致返回“404”状态码或自定义404错误原创 2017-04-03 11:45:03 · 2212 阅读 · 0 评论 -
c++动态绑定与静态绑定&&effective 37条
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误,需要理解四个名词: 1. 对象的静态类型:对象在声明时采用的类型。是在编译期确定的。 2. 对象的动态类型:目前所指对象的类型。是在运行期决定的。 对象的动态类型可以更改,但是静态类型无法更改。关于对象的静态类型和动态类型,看一个示例:class B{}class原创 2017-04-03 23:21:57 · 725 阅读 · 0 评论 -
RTTI运行时类型识别
RTTI是Runtime Type Identification的缩写,是“运行时类型识别”的意思。面向对象的编程语言,象C++,Java,Delphi都提供了对RTTI的支持。 本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI。本文还将详细描述两个重要的 RTTI 运算符的使用方法,它们是 typeid 和dynam原创 2017-04-04 22:59:19 · 597 阅读 · 0 评论 -
声明与定义的区别
清楚明白声明与定义是一名合格的程序猿的基本要求。 本人认为,C++编码过程中谈及“声明”和“定义”是因为我们要使用一个变量、类型(类、结构体、枚举、共用体)或者函数,因此有申明和定义变量、类型和函数之说。C/C++中,使用一个变量、类型或者函数必须先在使用前申明它。 请记住: (1)“声明”与“定义”的本质区别是:声明可以出现多次,而定义只能出现一次。 (2)把申明的东西放在头文件原创 2017-04-04 23:06:05 · 890 阅读 · 0 评论 -
c++对象中的易错题集-拷贝构造了多少次
#includeusing namespace std;static int i = 0;class Widget{public: Widget() { //cout << i++ << endl; } Widget(Widget &w) { (*this) = w; cout << i++ << endl; }};Widget f(Widget u){原创 2017-03-14 21:19:08 · 373 阅读 · 0 评论 -
关于sizeof的一些小细节
#include<iostream>using namespace std;char test1(){ cout << "test1" << endl; return 'c';}int test2(){ cout <<"test2" << endl; return 1;}char test3(int *p){ *p = 10; ret原创 2017-04-04 23:19:39 · 961 阅读 · 4 评论 -
两种方法位运算实现加法器
按照惯例先来一段代码: 先看feibo1#include<iostream>using namespace std;int feibo1(int n){ int res; int first = 1; int second = 1; if (n < 3) { return 1; } for(int i = 2; i <原创 2017-04-14 00:01:24 · 1382 阅读 · 0 评论 -
条款12:复制对象时勿忘其每一部分
复制对象时要把对象的每一部分都赋值到位,尤其在有基类的时候容易遗漏复制 #include<iostream>using namespace std;class Date{public: Date(int d = 1, int m = 1, int w = 1) :day(d), month(m), weekday(w) { cout << "基类构造函数"原创 2017-05-10 20:01:51 · 339 阅读 · 0 评论 -
智能指针之scopedptr
话不多说直接上代码:#include<iostream>using namespace std;#include<cassert>template<class T>class Scopedptr{public: Scopedptr(T* ptr = nullptr) :_ptr(ptr) {} T *operator->() { retur原创 2017-05-10 20:26:55 · 839 阅读 · 0 评论 -
new与delete原理解析
new和delete最终调用malloc和free,关于malloc和free实现原理参见这篇文章:http://blog.youkuaiyun.com/passion_wu128/article/details/38964045 new new操作针对数据类型的处理,分为两种情况: 1,简单数据类型(包括基本数据类型和不需要构造函数的类型) 代码实例:int* p = new int; 汇编码如下:原创 2017-05-12 17:00:02 · 736 阅读 · 0 评论 -
String类的写时拷贝
String类的写时拷贝#include<iostream>#include<assert.h>using namespace std;class String{public: friend ostream& operator <<(ostream &os, String &str); String(char *str = "") :_str(new char[strlen原创 2017-04-03 11:14:25 · 547 阅读 · 0 评论 -
c程序设计语言之注释转换-状态机
最近在研究c语言之父的c程序设计语言,里面有一个关于将c注释转换成c++注释的问题,要用到状态机的知识:这里总结一下,并附上源代码 有限状态机体现了两点:首先是离散的,然后是有限的。 State: 状态这个词有些难以定义,状态存储关于过去的信息,就是说它反映从系统开始到现在时刻的输入变化。 Actions & Transitions: 转换指示状态变更,并且用必须满原创 2017-04-03 10:04:22 · 596 阅读 · 0 评论 -
实现一个无法被继承的类
一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有,使得这个类的构造函数对子类不可见,那么这个类也就不能继承了。但是,这引出一个问题,客户程序岂不是也无法实例化这个类了?OK,让我们参考一下Singleton模式,用一个static函数来帮助创建这个类的实例,问题就解决了!class CParent{p原创 2017-04-02 23:49:46 · 341 阅读 · 0 评论 -
打印输入的内容并添加行号
#includeusing namespace std;int main(){ char c; int i = 0; bool flag = true; while ((c = getchar()) != EOF) { if (flag) { cout << i; flag = false; } if ('\n' == c) { flag =原创 2017-03-14 21:21:12 · 428 阅读 · 0 评论 -
易错题之前置++后置++
#includeusing namespace std;int main(){ int m = 5; if (m++ > 5) { cout << m << endl; } else cout << --m;//5 system("pause");}//由此又即兴忆起金山的一道笔试题#includeusing namespace std;int main(int原创 2017-03-14 21:22:50 · 848 阅读 · 0 评论 -
计算2+22+222
#includeusing namespace std;int main(){ int sum = 0; int total = 0; int n; cin >> n; for (int i = 0; i < n; i++) { sum = sum * 10 + 2; total += sum; } cout << total << endl; system("pa原创 2017-03-14 22:36:17 · 1028 阅读 · 0 评论 -
模拟实现Vector高级版
总结一下实现Vector时遇到的问题:1.delete[]的时候总是报错,应当第一时间想到delete[]和new[]的匹配问题,可能由于自己太过自信,没有往那方面想,以至于浪费了好长时间调试代码2.遇到错误应当现检查逻辑问题,然后再调试,不要浪费时间在寻找错误上,用调试技巧寻找错误会事半功倍。3.关于数组下标问题,数组下标总是比数组大小少一个学到的知识:1.const &是专原创 2017-03-25 09:33:30 · 354 阅读 · 0 评论 -
中缀表达式转后缀前缀表达式的简单方法
35,15,+,80,70,-,*,20,/ //后缀表达方式(((35+15)*(80-70))/20) //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 一个中缀式到其他式子的转换方法~~ 这里我给出一个中缀表达式~ a+b*c-(d+e) 第一步:按照运算符的优先级对所有原创 2017-04-02 00:34:59 · 1047 阅读 · 0 评论 -
引用的全面理解
什么是引用?引用是在C++2.0版本引入的。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量一直绑定在一起共用同一块内存空间。一般情况,引用具有以下性质。1.引用不是一个变量,只是一个已存在变量的别名。int a = 10; int& ra = a;//ra是a的引用 //sizeof(ra) == sizeof(a) ra =原创 2017-04-02 00:48:32 · 510 阅读 · 0 评论 -
关于拷贝构造隐式转换和return时优化的一些思考
关于拷贝构造隐式转换和return时优化的一些思考#includeusing namespace std;class A{public: A() { cout << "构造" << endl; } A(int n) { a = n; } A(A&a1) { a = a1.a;原创 2017-03-26 12:19:38 · 319 阅读 · 0 评论 -
模拟String类
模拟String类#includeusing namespace std;class String{public: String(char *data="") { if (*data == '\0') { _data = new char[1]; *_data = '\0'; } else { _data = new char[strlen(d原创 2017-03-26 12:30:20 · 439 阅读 · 0 评论 -
单例设计模式-懒汉饿汉
懒汉模式:#include<iostream>using namespace std;class Single_Lazy{public: static Single_Lazy *getInstance() { if (s == nullptr) { s = new Single_Lazy(); }原创 2017-04-02 23:42:22 · 403 阅读 · 0 评论 -
缓冲区
缓冲区分为三种分别是:全缓冲、行缓冲和无缓冲 1. 全缓冲:当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写 2. 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O(流)操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。 3. 无缓冲:不进行缓冲,标准出错情况stderr是典型代表,这使原创 2017-05-06 08:54:23 · 505 阅读 · 0 评论 -
volatile关键字详解
作用 volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. 简单地说就是防止编译器对代码进行优化.比如如下程序:XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x58; 对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认原创 2017-06-05 18:31:00 · 964 阅读 · 0 评论 -
选择排序法及其优化
选择排序法及其优化c语言实现原创 2017-03-10 22:41:37 · 909 阅读 · 0 评论 -
合法IP&窗口最大值数组&打印素数&递归逆序一个栈&栈排序另一个栈&MyString&寻找数组中出现的重复字符&数组中的重复数字&逆序打印链表&空格替换成%20
1. 判断字符串是否是IP地址#include<stdio.h>#include<string.h>int main(void){ char str[31], temp[31]; int a, b, c, d; while(gets(str) != NULL) { if (sscanf(str, "%d.%d.%d.%d", &a, &b, &c原创 2017-07-04 12:39:01 · 425 阅读 · 0 评论 -
每天一道算法题-汉诺塔
/* 汉诺塔问题,有三根棒为A、B、C。A棒上叠放着n个大小不等的盘, 依次叠加为大盘在下,小盘在下。要求把这n个盘移到C棒上,在移 动过程中可以借助B棒,每次只能移一个盘,并且在移动过程中必须保 持3根棒上的大盘在上,小盘在下。编写程序,并打印出移盘步骤。*//***************思路*************************************//*当只有...原创 2018-10-07 22:15:17 · 655 阅读 · 0 评论 -
2018 11.9
从4行代码看右值引用 https://www.cnblogs.com/qicosmos/p/4283455.htmlc++11多线程编程(九):std::async介绍与实例 https://blog.youkuaiyun.com/lijinqi1987/article/details/78909479c++11多线程编程(八):std::future , std::promise和线程的返回值http...原创 2018-11-09 11:32:06 · 162 阅读 · 0 评论 -
18.11.12
do{}while(0)的意义。https://www.jianshu.com/p/99efda8dfec9https://www.cnblogs.com/wangpei0522/p/4546752.html原创 2018-11-12 19:23:00 · 158 阅读 · 0 评论 -
18.12.5
dumpbin使用查看lib导出函数https://blog.youkuaiyun.com/ermen2009/article/details/17964813原创 2018-12-05 10:03:58 · 169 阅读 · 0 评论 -
do while(0)是否有其意义?
在一些C语言程序中我们会看到do…while(0);这样的语句,这样的用法貌似画蛇添足,实际却颇有妙用。单独来看,do…while(0)和顺序执行`…部分的代码的效果并无二致,然而在如下两种情况下的效果却十分巧妙。一.宏定义中实现局部作用域我们知道宏定义只是做一个标识符和字符串的替换,尽管宏定义的形式可以类似于函数,但是它实际并不具备与函数类似的局部作用域。当然了,我们可以通过在宏定义中使...原创 2019-01-17 20:40:16 · 3306 阅读 · 0 评论 -
应用程序全屏工具
windows应用程序全屏工具#include<iostream>#include<Windows.h>int main(){ HWND hWnd = FindWindow(NULL, "输入"); LONG_PTR Style = ::GetWindowLongPtr(hWnd, GWL_STYLE); Style = Style &~WS_CAPT...原创 2019-01-16 18:57:01 · 1183 阅读 · 0 评论 -
C++面向对象程序设计 谭浩强 第一章答案
1.请根据你的了解,叙述C++ 的特点。C++ 对C有哪些发展?【解】 略。2.一个C++的程序是由哪几部分构成的?其中的每一部分起什么作用?【解】 略。3.从拿到一个任务到得到最终结果,一般要经过几个步骤?【解】 略。4.请说明编辑、编译、连接的作用。在编译后得到的目标文件为什么不能直接运行?【解】 编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文件,在分别对它...原创 2019-06-07 00:04:35 · 3744 阅读 · 1 评论 -
什么是算术运算?什么是关系运算?什么是逻辑运算?
算术运算算术运算:用于各类数值运算.包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种.算术运算简称运算。 指按照规定的法则和顺序对式题或算式进行运算,并求出结果的过程。包括:加法、减法、乘法、除法、乘方、开方等几种运算形式。其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果有几级运算存在,则应先进行高级运算,再进行...原创 2019-06-07 10:02:53 · 28405 阅读 · 3 评论 -
day16-day18代码片段
1. 二叉树的层序遍历void _LevelOrder(Node *pRoot) { Node *pCur = pRoot; queue<Node *> q; q.push(pCur); while (!q.empty()) { Node *pTop = q.front();原创 2017-07-17 14:18:27 · 274 阅读 · 0 评论 -
day19-day21代码片段
1. 1-n中某数字出现的次数#include<iostream>using namespace std;int getNum(int n,int k){ int count = 0; int x; for (int i = 1; x=n/i; i *= 10) { int high = x / 10; if (k == 0)原创 2017-07-21 23:32:09 · 418 阅读 · 0 评论 -
effective c++条款5 了解编译器默认编写那些函数
一个空类里面都默认包含那些函数 . 构造函数 · 拷贝构造函数 . 析构函数 . 赋值操作符重载 . 取地址运算符重载 . const取地址运算符什么条件下编译器不会默认合成赋值操作符重载,和默认构造函数 . 当成员变量包含const成员变量时,因为const成员变量只能被在初始化列表初始化,不能被赋值,所以也不会合成默认构造函数 . 当成员变量包含引用时,因为引用只能引用一个实体原创 2017-05-06 10:20:47 · 415 阅读 · 0 评论 -
条款6:若不想使用编译器自动生成函数,就该明确拒绝
前面我们已经知道,编译器会默认为我们合成六个成员函数分别是:构造函数、拷贝构造函数、析构函数、赋值运算符重载、取地址运算符重载、const取地址运算符重载。 那么如果我们如果不想要编译器为我们自动生成某些函数(尤其是复制和赋值构造函数)应该怎么办呢? 有一个简单的办法,就是将这个两个函数声明放在private中,而不去定义它们。这样,类的用户无法直接对这个类的对象进行赋值和复制。而且,因原创 2017-05-08 20:24:15 · 685 阅读 · 0 评论 -
条款7:为多态基类声明virtual析构函数
一般来讲如果基类类对象里如果申请了空间,基类对象的析构函数就应该声明为virtual析构函数,否则容易造成内存泄露。 举个栗子: #include<iostream>using namespace std;class Base{public: Base(){ cout << "base 构造" << endl; } // virtual ~Base(){cout原创 2017-05-08 20:46:59 · 535 阅读 · 0 评论