C++学习
文章平均质量分 64
猫小时候
最近在刷LeetCode,想把自己刷题的经历写下来,然后想多认识一些代码大神,也非常希望得到大家的意见。
展开
-
C++注释规范
1 源文件头部注释列出:版权、作者、编写日期和描述。 示例:/************************************************* Copyright:bupt Author: Date:2010-08-25 Description:描述主要实现的功能 **************************************************/转载 2015-11-05 17:18:57 · 388 阅读 · 0 评论 -
函数的值传递和引用传递
函数在每次调用时都会重新创建它的形参,并用传入的实参进行初始化。形参初始化的机理与变量初始化一样。 和其他变量一样,形参的类型决定了形参和实参交互的方式。如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参。 当形参是引用类型时,我们说它对应的实参被引用传递(pass by reference)或者函数被传引用调用(called by reference)。和其他引原创 2016-03-09 13:06:39 · 1274 阅读 · 0 评论 -
令operator=返回一个reference to *this
1.我们先看一个例子int x,y,z;x = y = z =15; 上述连锁赋值表达式被解析为:x = (y = (z = 15)); 这里15先被赋值给z,然后其结果再被赋值给y,最后赋值给x。2.如何实现“连锁赋值” 为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参。这是我们为classes实现赋值操作符时应该遵循的协议:class Widget原创 2016-03-09 10:02:19 · 641 阅读 · 0 评论 -
C++中慎用逐位拷贝(bitwise copy)的函数
1.简单介绍C语言中的memcpy(),memset(),memcmp()函数 memcpy(),memset(),memcmp()等这些内存操作函数经常会帮我们完成一些数据复制、赋值等操作。因为C语言中,无论是内置类型,还是自定义类的结构类型(struct),其内存模型对于我们来说都是可知的,透明的。所以我们可以对该对象的底层字节序列一一进行操作,简单而有效。例如如下代码:struct ST原创 2016-04-03 00:25:55 · 2791 阅读 · 0 评论 -
内存分配方式
内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc原创 2016-03-11 10:09:45 · 352 阅读 · 0 评论 -
main执行前后
转载:http://blog.csdn.net/sunmenggmail/article/details/7623492 main函数执行之前,主要就是初始化系统相关资源: 1. 设置栈指针 2. 初始化static静态和global全局变量,即data段的内容 3. 将未初始化部分的赋初值:数值型short,int,long等为0,bool 为FALSE,指针为NULL,等等,即.bss段转载 2016-03-11 10:28:09 · 384 阅读 · 0 评论 -
修炼成C++高手必看的C++书单
C++/OPP/OOD系列: 层级一:语法/语意(C++)[Lippman2000] Essential C++ Essential C++,by Stanley B. Lippman Addison Wesley Longman 2000,276 pages Essential C++ 中文版 ,侯俊杰 译,282页 Desc: 这本书概要性的介绍了C++核心的东西,但讲得较浅显,适合转载 2016-04-05 12:03:37 · 1259 阅读 · 0 评论 -
C++ 图的遍历
图的基础知识大家都能搜到,只是最近我在找图算法时看到的C++代码都是很旧之前的版本了,所以这里用了STL来重新写了一遍。图的邻接表存储结构的类型声明//边结点结构类型 struct ANode { int adjvex; //边的终点位置 ANode* nextarc; //指向表头结点下一条邻接的边 int info; //该边的相关信息,对于带权原创 2016-02-28 18:46:36 · 7490 阅读 · 1 评论 -
类成员函数的重载、覆盖和隐藏
成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual 关键字。“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1)如果原创 2016-03-13 14:45:10 · 386 阅读 · 0 评论 -
浅谈C++内联函数
将函数指定为内联函数(inline),通常就是将它在每个调用点上“内联地”展开。。假设我们把shorterString函数定义成内联函数,则如下调用:cout<<shorterString(s1,s2)<<endl;将在编译过程中展开成类似于下面的形式:cout<<(s1.size()<s2.size() ? s1 : s2)<<endl;从而消除了shorterString函数的运行时开销。为什么原创 2016-03-13 16:03:12 · 691 阅读 · 0 评论 -
Named Return Value Optimization
已知下列函数定义:X bar() { X xx; // process xx ... return xx;} 你可能会问bar()的返回值如何从局部对象xx中拷贝过来?实现模型1返回值的初始化(Return Value Initialization) Stroustrup在cfront中的解决做法是一个双阶段转化:首先加上一个额外参数,参数类型是对对象的引用,用来存放原创 2016-03-24 13:04:09 · 782 阅读 · 0 评论 -
指针和对象存取数据成员有什么区别?
如果我们有两个定义:Point3d origin,*pt = &origin; 用它们来存取data member,像这样:origin.x = 0.0;pt->x = 0.0 通过origin存取,和通过pt存取,有什么重大差异么? 当Point3d是一个derived class,而其继承结构中有一个virtual base class,并且被存取的member(如本例中的x)是一个从该原创 2016-03-24 13:24:35 · 798 阅读 · 0 评论 -
最全面的C/C++编码规范总结
对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读性、可维护性。例如我们可以规定某个项目的C语言程序要遵循这样的规定:变量的命名,头文件的书写和#include 等等。下面是一些广为采用的编码规范:GNU Coding StandardsGuidelines for the Use of the C Language i转载 2016-02-29 11:41:13 · 2223 阅读 · 0 评论 -
C++中new与malloc的10点区别
1.申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。转载 2016-03-01 09:09:52 · 457 阅读 · 0 评论 -
Mac编译C++代码
今天偶然才知道原来Xcode能够编译C++代码,这一个多月来我都是用g++ -o 来编译运行调试的啊,我的天~~原创 2016-03-14 23:52:12 · 754 阅读 · 0 评论 -
静态绑定和动态绑定
对象所谓的静态类型,就是它在程序中被声明时所采用的类型;动态类型则指“目前所指对象的类型”。例如以下继承体系:class Shape{public: virtual void draw() const = 0; ...};class Rectangle:public Shape { virtual void draw() const; ...};class Ci原创 2016-03-27 22:21:25 · 541 阅读 · 0 评论 -
First Missing Positive
题目名称First Missing Positive描述Given an unsorted integer array, find the first missing positive integer.For example, Given [1,2,0] return 3, and [3,4,-1,1] return 2.Your algorithm should run in O(n) tim原创 2016-08-08 08:58:20 · 644 阅读 · 0 评论 -
map与unordered_map
一、简介 随着C++ 0x标准的确立,C++的标准库中也终于有了hashtable。很久以来,STL中都只提供 <map>作为存放对应关系的容器,内部通常用红黑树实现,原因是二叉平衡树(如红黑树)的各种操作,插入、删除、查找等,都是稳定的时间复杂度,即O(logn);但是对于hash表来说,由于无法避免re-hash所带来的性能问题,即使大多数情况下hash表的性能非常好,但是re-hash所带原创 2016-08-08 09:02:15 · 1084 阅读 · 0 评论 -
new与malloc的区别
一、我们先来看个例子1.new 返回指定类型的指针,并且可以自动计算所需要大小int *p;p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);int* parr;parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;2.malloc 则必须要由我们计算字原创 2016-02-23 16:34:08 · 1577 阅读 · 0 评论 -
构造函数成员初始值列表(member initialization list)
为什么对象使用前需要初始化1.读取未初始化的值会导致不明确的行为 在某些平台上,仅仅是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序行为,以及许多令人不愉快的调试过程。 永远在使用对象之前将它初始化:对于无任何成员的内置类型,你必须手工完成此事;对于内置类型以外的任何其他东西,初始化责任落在狗原创 2016-03-10 14:11:27 · 4732 阅读 · 1 评论 -
冒泡排序
1 C++代码/************************************************* Copyright: 武汉大学计算机学院B507 Author: RyanDate: 2015-11-05 Description: 冒泡排序 **************************************************/ #include<iost原创 2015-11-05 21:23:42 · 354 阅读 · 0 评论 -
选择排序
1 c++代码#include<iostream>#include<vector>#include<algorithm>using namespace std;void select(vector<int> &nums){ for(int i=0;i<nums.size()-1;i++) { //pos总是定位到未排序部分的最小值 int pos=i;原创 2015-11-05 22:01:55 · 289 阅读 · 0 评论 -
字典序—lexicographical order
字典序简介 英文名叫lexicographical order,数字可以作为特别的字符串,这种情况下,如果我们用字典序进行比较,就有可能会出现下面这种情况: ”100”<”1000”(加引号的目的是为了区别数字与数字串),事实上,在计算机里,我们会这么看? 和之前一样,我们会首先比较第一个字符,这里”1”=’1’(已经可以看到区别了、在数中,数字因为位置的不同会有不同的意义,而这里,这原创 2015-11-03 16:05:47 · 23278 阅读 · 0 评论 -
C++中数据类型转换
1.stringstream简介 C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。 (1)istringstream类用于执行C++风格的串流的输入操作。 (2)ostringstream类用于执行C风格的串流的输出操作。 (3)strstream类同时可以支持C风格的串流的输入输原创 2015-10-20 19:13:22 · 790 阅读 · 0 评论 -
插入排序
1 c++代码/************************************************* Copyright: 武汉大学计算机学院B507 Author: RyanDate: 2015-11-06 Description: 插入排序 **************************************************/ #include<iost原创 2015-11-06 14:23:09 · 368 阅读 · 0 评论 -
详谈C++中数组作为函数参数
一、一个例子引发的思考 运行以下代码,请问输出是什么?例子来源于《剑指Offer》,我对书上例子做了修改,让其可以运行。#include<iostream>using namespace std;int GetSize(int data[]) { return sizeof(data);}int main() { int data1[] = {1,2,3,4,5};原创 2015-10-26 12:33:48 · 16324 阅读 · 0 评论 -
C++中将string按照空白字符分割的新方法
使用stringstream对象简化类型转换 首先要引入头文件<sstream>,C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。 <sstream>库是最近才被列入C++标准的。(不要把<sstream>与标准发布前被删掉的<strstream>弄混了。)因此,老一点的编译器,如GCC2.95,并不支持它。如果你原创 2015-10-14 13:25:03 · 42031 阅读 · 3 评论 -
使用class或struct关键字定义类
1.访问控制与封装 在C++语言中,我们使用访问说明符(access specifiers)加强类的封装性。定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口。定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了(即隐藏了)类的实现细节。 一个类可以包含0个或多个访问说明符,而且对于某个访问原创 2015-10-29 20:52:54 · 3068 阅读 · 0 评论 -
学习C++,应该循序渐进看哪些书?
阶段 1《Essential C++》 这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。 《C++ Primer》 本书对C++基本概念、技术、以及现代C++编程风格进行了全面而且权威的阐述,是C++初学者的最佳指南;本书可以原创 2015-10-29 22:01:53 · 1409 阅读 · 0 评论 -
Palindrome Number
题目名称 Palindrome Number—LeetCode链接描述 Determine whether an integer is a palindrome. Do this without extra space.分析 判断一个数是否为回文数。回文数 我才用的方法是将整数转换成字符串,利用上一篇文章中讲到的C++字符串流<sstream>。设定一前一后指针,分别指向字符串的头尾,如果不原创 2015-10-15 10:20:13 · 530 阅读 · 0 评论 -
一道面试题引发的对数据类型转换的思考
面试题目,看代码写结果#include<stdio.h>char getChar(int x, int y) { char c; unsigned int a = x; (a + y > 10)?(c=1):(c=2); return c;}int main() { char c1 = getChar(7,4); char c2 = getChar(7原创 2016-03-01 16:45:49 · 629 阅读 · 0 评论 -
区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
最近在很多地方看到了这个问题,但是网上都没有很好的解释,很多面试书中解释的也不详尽,今晚翻阅《More Effective C++》的时候偶尔看到了这个解释,恍然大悟,心情大好,这里记录下来。背景 很久很久以前(大约20世纪80年代后期),在一个遥远的语言(我是指当时的C++)中,没有什么办法可以区分++和–操作符的前置式(prefix)和后置式(postfix)。 但程序员毕竟是程序员,他原创 2016-03-02 00:24:00 · 2052 阅读 · 0 评论 -
使用vector创建一个二维数组(一)
最近在刷题的时候遇到过好几次二维数组的问题,因为我自己想在C++方向发展,所以尽可能地用C++提供的STL来完成编程,但是在使用二维数组的时候遇到了麻烦,就是如果用int[][]这种直接表示方式很简单,如果用vector的话就有点麻烦,为此我也查了一下资料。 定义一个二维整形数组并初始化:vector<vector<int> > array(m); //这个m一定不能少//初始化一个m*n的原创 2016-02-29 09:30:09 · 40720 阅读 · 1 评论 -
使用vector创建一个二维数组(二)
创建一个m*n的整型二维数组:vector<int> temp(n); //先创建一个含有n个元素的一维数组 vector<vector<int>> matrix(m,temp); //再根据穿件m个含有n个元素的一维数组构成的二维数组测试代码:#include<iostream>#include<vector>using namespace std;int main() {原创 2016-03-02 10:13:32 · 4015 阅读 · 0 评论 -
用C++实现bitmap
位图数据结构 该数据结构描述了一个有限定义域内的稠密集合,其中的每一个元素最多出现一次并且没有其他任何数据与该元素相关联。即使这些条件没有完全满足(例如,存在重复元素或额外的数据),也可以用有限定义域内的键作为一个表项更复杂的表格索引。1.什么是bitmap? 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在原创 2016-03-16 22:10:10 · 9037 阅读 · 0 评论 -
C语言中的位移运算
位移运算1.左移//C左移表达式x<<k; 对于一个n位的操作数x,x<<k操作会生成一个值:x向左移动k位,丢弃最高的k位,并在右端补k个0。位移量应该是一个0~n-1之间的值。 位移运算是从左至右可结合的,所以x<<j<<k等价于(x<<j)<<k。2.右移//C右移表达式x>>k; 一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0;算术右移是在左端补k原创 2016-03-17 10:49:05 · 15607 阅读 · 0 评论 -
Implement Trie (Prefix Tree)
题目名称 208. Implement Trie (Prefix Tree)描述 Implement a trie with insert, search, and startsWith methods.Note: You may assume that all inputs are consist of lowercase letters a-z.分析 字典树(Trie),又称单词查找原创 2016-03-17 21:18:03 · 506 阅读 · 0 评论 -
C++数字转换成字符串(to_string)
std::to_string C++ Strings library std::basic_string Defined in header <string>(1) std::string to_string( int value );(2) std::string to_string( long value );(3) std::string to_string( long long原创 2016-08-12 00:22:08 · 19014 阅读 · 0 评论