C++
C++
Bob__yuan
这个作者很懒,什么都没留下…
展开
-
C++ - Can we call an undeclared function in C++?
https://www.geeksforgeeks.org/g-fact-28/ 如下代码,在C中可以运行,但是在C++中原创 2020-01-30 10:36:03 · 337 阅读 · 0 评论 -
Visual Studio 常用快捷命令
一、Ctrl + xx / Ctrl + Shift + xx三、Else一、Ctrl + xx / Ctrl + Shift + xxCtrl + Tab:打开的文件之间的切换vs上方有最近打开的文档,右上角的下拉小箭头可以所有打开的文档,不过看起来还是不方便,Ctrl + Tab 可以打开所有活动文件,在这个界面可以按键盘上下左右键,也可以直接用鼠标选择一个打开。Ctrl + k ...原创 2019-12-27 13:33:41 · 718 阅读 · 0 评论 -
【C++】final/override、如何设计一个不能被继承的类
final 和 override 都是在特定场景使用有特殊含义的标识符(specifier / identifier ),并不是C++保留的关键字(not a reserved keyword )。final specifier (since C++11)Specifies that a virtual function cannot be overridden in a derived...原创 2019-11-02 17:51:47 · 593 阅读 · 0 评论 -
【C++】指针和引用的区别
面试中常会问到:“讲一讲指针和引用的区别”,主要区别如下表所示:指针引用变量指针是一个变量,不过变量存储的是一个地址,指向内存中的一个存储单元引用只是别名解引用使用时需要 dereference(*p)不需要解引用定义与初始化可以初始化为nullptr,也可以不初始化(默认为空)定义时必须初始化,且不能为空能否修改内容指针可以指向别的内容...原创 2019-10-26 10:27:10 · 313 阅读 · 0 评论 -
const 指针与迭代器
正常的指针是很好记的:const 在 * 前边,表示 *p 不能变;cosnt 在 * 后边,表示 p 不能变;前后都有 const 表示 *p 和 p 都不能变。 但是 STL vector 的 iterator 和 const_iterator 是不一样的:#include <iostream>#include <vector>using nam...原创 2019-10-22 20:55:04 · 246 阅读 · 0 评论 -
【C++】extern “C“
extern “C” 被 extern 限定的函数或变量是 extern 类型的 被 extern “C” 修饰的变量和函数是按照 C 语言方式编译和链接的。 extern “C” 的作用是让 C++ 编译器将 extern “C” 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题。extern “C” 块应用 在 C 和...原创 2019-10-21 11:05:14 · 278 阅读 · 1 评论 -
vector push_back 时间复杂度分析
《C++程序设计语言》第4部分:标准库,里边写 vector,第一句如下:The STL vector is the default container. Use it unless you have a good reason not to. If your suggested alternative is a list or built-in array, think twice....原创 2019-10-19 22:21:15 · 4711 阅读 · 0 评论 -
【C++】static关键字
分为4部分:static 修饰非成员变量和函数static 修饰非成员变量static 修饰非成员函数static 修饰成员变量和函数static 修饰成员变量static 修饰成员函数一、static 修饰非成员变量和函数1.1 static 修饰非成员变量 C/C++ 中,static 修饰的非成员变量分为静态全局变量和静态局部变量,两种静态变量都是存储在全...原创 2019-10-14 21:14:16 · 348 阅读 · 0 评论 -
【C++】模板特化、偏特化
模板分为函数模板和类模板,特化分为全特化和偏特化。使用模板的时候,我们的目的就是希望可以不用每个类型实现一遍,而是用一个模板代替这个类型。如果所有类型的实现都是一个统一的一样的实现,就不需要模板特化或者偏特化了,但是大多数情况是肯定有特殊版本需要特殊处理的,下边用两个典型的例子记录一下:1、hash<_Kty>:模板全特化2、vector<bool>:模板偏特化一...原创 2019-09-24 13:25:37 · 2358 阅读 · 0 评论 -
字符数组、字符串指针
先放代码:#include <iostream>using namespace std;int main() { char a[] = "abcdef"; const char* b = "abcdef"; // C++11 不允许 char* p = "abc"; 了,必须有 const char c[] = { 'a', 'b', 'c', 'd', 'e', '...原创 2019-09-17 11:05:13 · 171 阅读 · 0 评论 -
【C++】list splice、LRU cache
在做 LeetCode - 146. LRU Cache 的时候用到了 list 的 splice 功能,做一个记录。一、list::splice 先讲 splice 功能。splice 是剪接、胶接的意思,比如剪接电影、胶接磁带这样的,用在 list 上就是在一个 list 中剪接上另一个 list 的部分或全部内容。英文介绍如下:Transfer elements from l...原创 2019-09-06 15:17:33 · 612 阅读 · 0 评论 -
【C++】 类的内存对齐、虚函数表
本文分为以下几个部分内容:什么是内存对齐,为什么要内存对齐C++的空类,以及没有虚函数和非静态变量的类正常的C++类的内存分布变量的内存对齐虚函数一、什么是内存对齐,为什么要内存对齐1.1 什么是内存对齐: 内存对齐是从硬件层面出现的概念。可执行程序是由一系列CPU指令构成的,其中有一些指令是需要访问内存的。在很多CPU架构下,这些指令都要求操作的内存地址(更准确的...原创 2019-09-04 14:25:14 · 1935 阅读 · 0 评论 -
【C++】菱形继承
C++的继承和多态是面试经常回问的问题,菱形继承问的会少一点,但是问到了还是知道些的好。一、正常单继承 对于正常的单继承,可以看到多态的实现,父类指针指向孙子类对象:class A {public: virtual void foo() { cout << "A foo()" << endl; }};class B :public A { void ...原创 2019-09-06 12:02:51 · 270 阅读 · 0 评论 -
【C++】 new delete、new[] delete[] 详解
C++ 中,new、delete 和 sizeof 一样,都不是函数,都是操作符。面试经常回问 malloc/free 和 new/delete的区别和联系:malloc/free 只是动态分配内存空间/释放空间,new/delete 除了分配空间还会调用构造函数和析构函数进行初始化与清理它们都是动态管理内存的入口malloc/free 是 C/C++ 标准库的函数,new/delet...原创 2019-09-03 16:29:50 · 1873 阅读 · 0 评论 -
【C++】 explicit 关键字
C++ 中 explicit 关键字用于指定类的构造函数或转换函数为显式,即它不能用于隐式转换和复制初始化。 C++ 11前,声明时不带函数说明符 explicit 的拥有单个无默认值形参的构造函数被称作转换构造函数。就是可以直接转换,比如 A(int) {} 那么 A a = 1; 是可以自动转换的,C++ 11后,多个无默认参数的可以这么转换了,如下:class A {public...原创 2019-08-26 15:20:15 · 170 阅读 · 0 评论 -
【C++】设计简单回调函数
当我们写二叉树遍历是,比如写最简单的二叉树前序遍历(二叉树遍历参考),如下:void inorder(TreeNode* root) { if (root != nullptr) { cout << root->val <<endl; inorder(root->left); inorder(root->right); }} ...原创 2019-08-22 16:48:02 · 295 阅读 · 0 评论 -
【C++】字符串的 hash 值计算
C++ 11 中新加入的容器 unordered_map 和 unordered_set 底层都是哈希表实现的,那么对于内置类型,肯定是可以自动计算出 hash 值的,但是对于像 pair<int, int> 或者 vector<int> 这样的,或者自定义的类这种复杂类型,就不能自动算出 hash 值了,编译会提示 The C++ Standard doesn’t p...原创 2019-08-22 16:11:42 · 12359 阅读 · 0 评论 -
【C++】四种强制类型转换
C++ 四种强制类型转换 C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。 ...原创 2019-02-28 21:05:08 · 45647 阅读 · 3 评论 -
【C++】vector 去重
记录一下C++ STL 中 vector 的去除重复元素的方法1、对于一个已经 sorted(升序降序皆可)的vector来说,去重只需要使用 unique 函数 unique 函数是从前向后遍历,将所有和前一个元素相同的元素放到 vector 尾部(“remove each matching previous”),然后返回指向第一个重复元素的迭代器(如果没有重复的,返回 finish,也就...原创 2019-03-10 15:57:08 · 2464 阅读 · 0 评论 -
【C++】构造函数、析构函数中的虚函数
今天腾讯一面问了道题,之前没有想过,说构造函数或者析构函数中有虚函数是,那实际执行的是哪个函数,面试完进行了测试,如下代码所示:#include <iostream>class A{public: A() { printf("*** A() begin ***\n"); f(); g(); printf("*** A() end ***\n\n"); ...原创 2019-03-19 19:18:12 · 966 阅读 · 0 评论 -
【C++】虚函数中的默认参数
网上面试题中有一道以前没有想过,也没有试过的题。就是在继承关系中,虚函数中如果有默认参数,实际过程中,默认参数是多少。 试验代码如下:#include <iostream>using namespace std;class A {public: virtual void foo (int i = 1) { cout << "foo in class A...原创 2019-03-27 15:15:34 · 2887 阅读 · 0 评论 -
【C++】STL next_permutation
做题过程中经常有全排列问题,直接用 STL 中的 next_permutation 方法其实就可以了(需要 #include )。#include <iostream>#include <string>#include <algorithm> // for "next_permutation"using namespace std;void Pe...原创 2019-04-05 15:33:43 · 398 阅读 · 0 评论 -
【C++】类的实例化方式限制
在C++中,类的实例化可以 A a; 或者 A *p = new A; ,有的时候想只能用其中一个中方式实例化。一、只能静态分配类对象,即 A a; 的方式进行实例化 这样需要将类的 new 和 delete 操作符重载为 protected,new[] 、delete[] 同理,如下:class A{public:protected: void* operator new(...原创 2019-04-01 10:50:59 · 732 阅读 · 1 评论 -
【C++】lambda表达式、generalized lambda-capture
C++11中新加入了lambda表达式,很是方便,最常见的使用就是在 STL 的 sort 函数中直接写排序方法,如下:#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ vector<int> v{ 1, ...原创 2019-04-25 18:38:54 · 526 阅读 · 0 评论 -
lambda 不能出现在未计算的上下文中
#include <memory>class A{ };void (*testDeleter)(int *) { [](int * ) {} };int main(){ A* pa = new A(); std::unique_ptr < A, decltype([](A * a){ delete a; }) > uptr(pa); // Er...原创 2019-06-26 15:58:11 · 916 阅读 · 0 评论 -
【C++】 typedef typename
typedef typedef 官方的解释如下:typedef - creates an alias that can be used anywhere in place of a (possibly complex) type name. 也就是说用来给类型名创建一个别名(alias),同时,typedef 可以出现在类型名的任何位置。简单的别名创建 最简单的例子如下: t...原创 2019-07-05 13:16:27 · 1025 阅读 · 0 评论 -
【C++】std::pair 作为 std::unordered_map 的 key
unordered_map 是 C++ 11 中新加入的容器,和没有标准化的 hash_map 一个意思,使用 hash 表作为底层数据结构,那么对于键值就需要有 hash function 计算出对应的 hash 值了。 对于内置函数,hash function 是自带的,不需要显示指定,如下所示,使用 int、string 作为键值是可以的,但是使用 vector 和 pair 是不行...原创 2019-07-26 20:19:42 · 3345 阅读 · 0 评论 -
【C++ 】map下标操作符
C++ 中,set、map、multiset、multimap 都是使用 RB-Tree 作为底层数据结构的,所以他们的代码其实就是封装了一层的红黑树区别在于:set 和 multiset 的键值就是实值,所以都不允许修改实值,因为会导致排序混乱。set 不允许有两个相同键值,multiset 则允许,所以 set 和 multiset 的区别就在于,set 的insert 调用的是红黑树...原创 2019-08-19 11:35:13 · 1089 阅读 · 0 评论 -
【快排】quickSort, introsort(C++ Sorting Weapon), 3-way quickSort
一、quickSort (recursive)二、introsort三、3-way quickSort四、quickSort (iterative)原创 2019-08-07 21:25:18 · 1060 阅读 · 0 评论 -
【C++】 单例模式
设计模式是面试中经常会问到的问题,而单例模式(Singleton Pattern)又是最常用的几个之一。其意图是保证一个类最多仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。 定义一个单例类需要: 1、私有化它的构造函数,以防止外界创建单例类的对象 2、使用类的私有静态指针变量指向类的唯一实例 3、使用一个公有的静态方法获取该实例 分为懒汉版(Lazy...原创 2019-08-20 15:06:47 · 255 阅读 · 0 评论 -
数组以及vector索引尝试
YSL教我写代码系列: 在YSL大神的指导下知道了数组除了可以用 a[2] 的形式获取元素,或者用指针的形式,还可以这么写: 2[a]。 相当于就是对于数组来说 a[2] 和 2[a] 是一样的意思,就是 [ ] 内外的两个东西相加,也就是都是 a + 2 的意思,指针 a 向后移动两个 int 型大小的内存位置。 我孤陋寡闻了,记录一下= =。...原创 2018-11-13 12:32:57 · 537 阅读 · 0 评论