c++
文章平均质量分 63
嵌入式产品侠
追梦人
展开
-
《剑指Offer》面试题1:赋值运算符函数
要求:如下类型为CMyString的声明,请为类型添加赋值运算符函数。class CMyString{public: CMyString(char *pData = nullptr); CMyString(const CMyString &); ~CMyString(void);private: char *m_pData;};测试用例:把一个CMyStrin...原创 2019-05-27 17:12:39 · 215 阅读 · 1 评论 -
《剑指Offer》面试题6:从尾到头打印链表
要求:从尾到头打印链表输入一个链表的头结点,从尾到头返过来打印出每个节点的值。链表的定义如下:struct ListNode{ int m_nKey; ListNode *m_pNext;};测试用例:功能测试(输入的链表含有多个节点;输入的链表含有一个节点) 特殊输入测试(输入的链表头结点指针为nullptr)本题考点:考查对单向链表的理解和编程能力 ...原创 2019-06-03 22:31:15 · 149 阅读 · 0 评论 -
《剑指Offer》面试题11:旋转数组中的最小数字
要求:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2,}为{1,2,3,4,5}的一个旋转,该数组的最下值为0。测试用例:功能测试(输入的数组是升序排序数组的一个旋转,数组中有重复数字或者没有重复数字) 边界值测试(输入的数组是一个升序排序的数组...原创 2019-06-10 20:44:35 · 152 阅读 · 0 评论 -
《剑指Offer》面试题12:矩阵中的路径
要求:矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3*4的矩阵中包含一条字符串“bfce”的路径。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个...原创 2019-06-10 22:01:14 · 200 阅读 · 0 评论 -
《剑指Offer》面试题13:机器人的运动范围
要求:机器人的运动范围 地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,他每次可以向左、右、上、下移动一格,但不能进入但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18.但他不能进入方格(35,38),请问该机器人能够到达多少个格子?测试用例:功能测试(方格为多行多列;k为正数...原创 2019-06-11 20:54:47 · 295 阅读 · 0 评论 -
C++RAII机制
什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源...原创 2019-06-25 18:16:34 · 26812 阅读 · 2 评论 -
完美转发
所谓完美转发(perfect formarding),是指在函数模板中,完全依照模板的参数的类型,将参数传递给函数模板中调用的另外一个函数。比如:template <typename T>void IamForwording(T t){ IrunCodeActually(t);}这个简单的例子中,IamForWording是一个转发函数模板。而函数IrunCod...原创 2019-07-01 21:23:40 · 745 阅读 · 0 评论 -
lambda表达式与仿函数
1. lambda表达式C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:[capture] (parameters) mutable 或 exception->return-type{statement}可以看到,Lambda 主要分为五个部分:[捕捉列表]、(操作符重载函数参数)、mutable 或 excep...原创 2019-06-26 18:44:53 · 1056 阅读 · 0 评论 -
初始化列表
在C++98中,标准允许使用花括号“{}”对数组元素进行统一的集合(列表)初始化设定,比如:这些都是合法的表达式。不过一些自定义类型,却无法享受着这样便利的初始化。通常,如标准程序库中的vector这样的容器,总是需要声明对象-循环初始化这样的重复动作,这对于使用模板的泛型编程无疑是非常不利的。事实上,在C++11中,集合(列表)的初始化已经成为C++语言的一个基本功能,在C++11中,这...原创 2019-07-02 17:48:28 · 452 阅读 · 0 评论 -
“= default”与“=deleted”
在C++中声明自定义的类,编译器会默认帮助程序员生成一些他们未自定义的成员函数,这样的函数版本被称为“默认函数”。这包含了一下一些自定义类型的成员函数:构造函数拷贝构造函数拷贝赋值函数移动构造函数移动赋值函数析构函数此外,C++编译器还会为以下这些自定义类型提供全局默认操作符函数:operatoroperator &operator &&op...原创 2019-07-02 21:45:06 · 188 阅读 · 0 评论 -
《剑指Offer》面试题16:数值的整数次方
要求:数值的整数次方实现函数 double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。测试用例:把底数和指数分别设为正数、负数和零本题考点:考查应聘者思维的全面性。问题本身并不难,但能顺利通过的应聘者不是很多。有很多人会忽视底数为0而指数为负数时的错误处理。 对效率要求高的面试官还...原创 2019-06-13 23:05:56 · 122 阅读 · 0 评论 -
《剑指Offer》面试题10:斐波那契数列
要求:斐波那契数列写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:测试用例:功能测试(如输入3、5、10等) 边界测试(如输入0、1、2) 性能测试(输入较大的数字,如40、50、100等)本题考点:考查对递归、循环的理解及编码能力。 考查对时间复杂度的分析能力。 如果面试官采用的是青蛙跳台阶的问题,那么同时还在考查应聘者的数学建模能力。源代码:...原创 2019-06-06 21:46:12 · 276 阅读 · 0 评论 -
《剑指Offer》面试题3-1:数组中重复的数字
要求:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。测试用例:长度为n的数组中包含一个或多个重复的数字 数组中不包含重复的数字 无效...原创 2019-05-28 10:58:14 · 157 阅读 · 0 评论 -
《剑指Offer》面试题4:二维数组中的查找
要求:二维数组中的查找在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数值。测试用例:二维数组中包含查找的数字(查找的数字是数组的最大值和最小值;查找的数字介于最大值与最小值之间) 二维数组中没有查找的数字(查找的是数字大于数组中的最大值;查找的数字小于数组中的最小值;...原创 2019-05-30 21:09:21 · 135 阅读 · 0 评论 -
《剑指Offer》面试题5:替换空格
要求:替换空格请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出”We%20are%20happy.”。测试用例:输入的字符串中包含空格(空格位于字符串的最前面;空格位于字符串的最后面;空格位于字符串的中间;字符串中有连续多个空格)。 输入的字符串不含有空格 特殊输入测试(字符串是一个nullptr指针;字符串是一个空字符串;字符...原创 2019-05-31 11:01:53 · 136 阅读 · 0 评论 -
《剑指Offer》面试题7:重建二叉树
要求:重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。二叉树节点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};测试用例...原创 2019-06-05 20:21:14 · 107 阅读 · 0 评论 -
《剑指Offer》面试题8:二叉树的下一个节点
要求:二叉树中的下一个节点 给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右节点的指针,还有一个指向父节点的指针。struct BinaryTreeNode{ int m_value; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; BinaryTreeNode...原创 2019-06-05 21:33:23 · 129 阅读 · 0 评论 -
《剑指Offer》面试题9:用两个栈实现队列
要求:用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入点和在队列头部删除节点的功能。template<typename T>class CQueue{public: CQueue(void); ~CQueue(void); void appendTail(cons...原创 2019-06-05 23:14:59 · 138 阅读 · 0 评论 -
《剑指Offer》面试题3-2:数组中重复的数字
要求:不修改数组找出重复的数字在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少存在一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。测试用例:长度为n的包含一个或多个重复的数字 不包含重复的数字 无效输入测试用例(输入空指针)本题考点:考查...原创 2019-05-29 10:10:10 · 189 阅读 · 0 评论 -
《剑指Offer》面试题14:剪绳子
要求:剪绳子 给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1,并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问看k[0]*k[1]*...*k[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2,3,3,的三段,此时得到的最大乘积是18。测试用例:功能测试(绳子的初始长度大于5) 边界值测试...原创 2019-06-12 20:27:03 · 2181 阅读 · 16 评论 -
《剑指Offer》面试题15:二进制中1的个数
要求:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制中表示1的个数。例如,把9表示成二进制是1001,有两位是1,因此,输出结果是2。测试用例:正数(包括边界值1、Ox7FFFFFFF) 负数(包括边界值Ox80000000,OxFFFFFFFF) 0本题考点:考查应聘者对二进制及位运算的理解。 考查应聘者分析、调试代码的能力。源代码:in...原创 2019-06-12 21:56:34 · 147 阅读 · 0 评论 -
移动语义
c++11中引入了移动语义,可以避免无谓的复制,提高程序性能。让我们一起学习“移动语义”c++11 测试右值 临时对象的构造 编译器会自动优化导致有些流程未打印,下面先介绍一下RVO。RVO(Return Value Optimization)是一种编译器优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象返回,那么这个临时对象会消耗一个构造函数(Constructor)、一...原创 2019-06-27 23:08:25 · 3785 阅读 · 6 评论 -
noexcept修饰符与noexcept操作符
目的:表示其修饰的函数不会抛出异常,编译器可以选择直接调用std::terminate()函数来终止程序的运行。从语法上将,noexcept修饰符有两种形式,一种就是简单地在函数声明后加上noexcept关键字。比如:void except_func() noexcept;另外一种则可以接受一个常量表达式作为参数,如下所示:void except_func() noexcept (...原创 2019-07-03 20:22:46 · 1154 阅读 · 0 评论 -
long long 整型
C++11将long long 整型加入其中。long long 整型有两种:long long 和 unsigned long long。在C++11中,标准要求long long整型可以在不同平台上有不同的长度,但至少有64位。我们在写常数字面量时,可以使用LL或ll后缀标识一个long long类型的字面量,而ULL、ull、Ull、uLL标识一个unsigned long long类型...原创 2019-07-03 20:41:44 · 1855 阅读 · 0 评论 -
非静态成员的sizeof
从C语言被发明开始,sizeof就是一个运算符,也是C语言中除了加减乘除以外为数不多的特殊运算符之一。而C++引入类类型之后,sizeof的定义也随之进行了扩展。在C++98标准中,对非静态成员变量使用sizeof是不能通过编译的。而在C++11中,对非静态成员变量使用sizeof操作是合法的。例如:class Point{public: Point() {}; int i = ...原创 2019-07-04 17:42:17 · 185 阅读 · 0 评论 -
final/override控制
final作用:C++11中final关键字的作用是使派生类不可覆盖它所修饰的虚函数。class Object {public: Object() {}; virtual void Foo() {};};class Base : public Object{public: Base() {}; void Foo() final {}; //声明为final};cl...原创 2019-07-04 18:42:29 · 143 阅读 · 0 评论 -
左值、右值与右值引用
在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。而在编译程序时,编译器有时也会在错误的信息中包含左值、右值的说法。不过左值、右值通常不是通过一个严谨的定义而为人所知的,大多数时候左右值的定义与判别方法是一体的。一个典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则成为“右值”。比如:a = b + c在这个赋值表达式中,a...原创 2019-06-30 21:17:09 · 278 阅读 · 0 评论 -
模板函数的默认模板参数
模板函数的使用template<typename T> void TempFun(T a){ cout << a << endl;}int main(){ TempFun(1); //实例化为TempFun<const int>(1) TempFun("1"); //实例化为TempFun<const char ...原创 2019-07-05 18:05:35 · 1067 阅读 · 0 评论 -
强类型枚举以及C++11对原有枚举类型的扩展
强枚举类型 非强类型作用域,允许隐式转换为整型,占用存储空间及符号性不确定,都是枚举类的缺点。针对这些缺点,新标准C++11引入了一种新的枚举类型,即“枚举类”,又称“强类型枚举”。语法:在enum后加上关键字classenum class EnumType { Point, Line, Rect};优势:强作用域,强类型枚举成员的名称不会被输出到其父作...原创 2019-07-11 20:36:51 · 438 阅读 · 0 评论 -
显式内存管理
程序员在处理现实生活中国的C/C++程序的时候,常会遇到诸如程序运行时突然退出,或占用的内存越来越多,最后不得不定期重启的一些典型状况。这些问题的源头可以追溯到C/C++中的显式堆内存管理上,通常情况下,这些症状都是由于程序没有正确处理堆内存的分配与释放造成的,从语言层面来讲,我们可以将其归纳为以下一些问题。 野指针:一些内存单元已经被释放,之前指向它的指针却还在被使用。...原创 2019-07-11 20:57:13 · 503 阅读 · 0 评论 -
C++11的智能指针
在C++98中,智能指针通过一个模板类型“auto_ptr”来实现。auto_ptr以对象的方式管理堆内存的分配,并在适当的时间,释放所获得的堆内存。这种堆内存管理的方式只需要程序员将new操作返回的指针作为auto_ptr的初始值即可,程序员不用显式地调用delete。比如:auto_ptr<int> ptr(new int); 这在一定程度上避...原创 2019-07-11 21:49:20 · 159 阅读 · 0 评论 -
C++中的四种强制类型转换
C++的类型转换有四种,以支持不同的需求,下面我们一起学习。1.static_cast转换① 基本语法:static_cast<type-id>expression② 使用场景a.用于类层次结构中基类和派生类之间指针或引用的转换上行转换(派生类->基类)是安全的下行转换(基类->派生类)由于没有动态类型检查,是不安全的b.用于基本数据类型之间的转...转载 2019-08-05 13:04:36 · 283 阅读 · 0 评论 -
基于范围的for循环
在C++98标准中,如果要遍历一个数组,通常会需要如下代码:#include <iostream>using namespace std;int main(){ int arr[5] = { 1,2,3,4,5 }; for (auto p = arr; p < arr + sizeof(arr) / sizeof(arr[0]); ++p) { *p *...原创 2019-07-09 21:50:56 · 360 阅读 · 0 评论 -
追踪返回类型
先看一个例子:template<typename T1, typename T2>decltype(T1 + T2) Sum(T1 &t1, T2 &t2){ return t1 + t2;}这样的写法虽然看似不错,不过编译器在推导decltype(t1 + t2)时,表达式中的t1和t2都未声明(编译器只会从左向右读入符号),按照C/C++编译器规则...原创 2019-07-09 21:34:40 · 263 阅读 · 1 评论 -
垃圾回收分类
垃圾回收:我们把之前使用过,现在不再使用或者没有任何指针指向的内存空间称为“垃圾”,而将这些“垃圾”搜集起来再次利用的机制称为 “垃圾回收”。现在,垃圾回收机制已经大行其道,在大多数编程语言中,我们都可以看到对垃圾回收特性的支持。如下表:各种编程语言对垃圾回收机制的支持 编程语言 对垃圾回收机制的支持 C++ 部分 Java 支持 Python 支持...原创 2019-07-12 21:23:10 · 482 阅读 · 0 评论 -
auto类型推导
一 静态类型、动态类型与类型推导在编程语言的分类中,C/C++常被冠以“静态类型”的称号,而有的编程语言则称为“动态类型的”,比如Python。静态类型和动态类型的主要区别在于对变量进行类型检查的时间点。对于所谓的静态类型,类型检查主要发生在编译阶段;而对于动态类型,类型检查主要发生在运行阶段。形如Python等语言的变量“拿来就用”的特性,则需要归功于一个技术,即类型推导。事实上,类型...原创 2019-07-03 21:44:39 · 545 阅读 · 0 评论 -
C++11与最小垃圾回收
C++11新标准为了做到最小的垃圾回收支持,首先对“安全”的指针进行了定义,安全派生的指针是指向由new分配的对象或其子对象的指针。安全派生指针的操作包括:1:在解引用基础上的引用,比如:&*p。2:定义明确的指针操作,比如p + 1。3:定义明确的指针转换,比如:static_cast<void*>(p)。4:指针和整型之间的reinterpret_cas...原创 2019-07-12 22:14:53 · 663 阅读 · 0 评论 -
运行时常量性与编译时常量性
在C++中,我们常常会遇到常量的概念。常量表示该值不可修改,通常是通过const关键字来修饰。比如:const int nNum = 100;const还可以修饰函数参数、函数返回值、函数本身、类等。在不同的使用条件下,const有不同的意义,不过在大多数情况下,const描述的都是一些“运行时常量性”的概念,即具有运行时数据的不可更改性。不过有时候我们需要的确实编译时期的常量性,这是c...原创 2019-07-13 10:23:20 · 934 阅读 · 0 评论 -
常量表达式函数
我们可以在函数返回类型前加入关键字constexpr来使其成为常量表达式函数,但并非所有的函数都有资格成为常量表达式函数。事实上,常量表达式函数的要求非常严格,总结如下:函数体只有单一的return返回语句。 函数必须返回值,不能是void函数。 在使用前必须已有定义。 return返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是常量表达式。由于比较好理解,这里不多做解释...原创 2019-07-13 11:06:47 · 3369 阅读 · 0 评论 -
变长函数和变长的模板参数
我们知道C++11已经支持了C99的变长宏。变长宏与printf的默契配合使得程序员能够非常容易地派生出printf的变种以支持一些记录。而printf则使用C语言的函数变长参数特性,通过使用变长函数,printf的实现能够接受任何长度的参数列表。不过无论是宏,还是变长参数,都无法获得传递参数的类型。一个变长函数如下:#include <stdarg.h>#include &...原创 2019-07-13 12:11:32 · 362 阅读 · 0 评论