![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
cpp
文章平均质量分 69
hywmj
这个作者很懒,什么都没留下…
展开
-
[C++] struct和class的区别与比较
C中的struct和C++中的struct的区别CC++成员函数不允许允许静态成员不允许允许访问属性默认public,不能修改默认public,还可以是private或者protected继承关系不可以继承可以从其他类或结构体继承初始化不能直接初始化数据成员可以直接初始化数据成员C是面向过程的编程语言,C++是面向对象的编程语言C中的结构体就是不同类型数据的集合,并不涉及算法和操作C++中是把数据变量及对这些变量的相关算法和操作给原创 2021-10-18 16:08:54 · 538 阅读 · 0 评论 -
[C++] 智能指针及循环引用问题
C++智能指针介绍由于C++没有自动回收内存机制,程序员每次new出来的内存需要手动delete,流程太复杂,忘记delete,会造成内存泄露。所以C++引入了智能指针,智能指针可用于动态资源管理。智能指针在memory头文件的std命名空间中定义。更具体的智能指针介绍可以参考我这篇博客:C++11新特性智能指针C++智能指针的类别C++11中的:unique_ptr、shared_ptr、weak_ptrC++98中的:auto_ptrunique_ptr只允许基础指针的一个所有者。可以移原创 2021-10-14 20:29:49 · 1740 阅读 · 1 评论 -
[C++] vector内存分配与释放机制
vector相关函数size():vector当前拥有的元素个数capacity():vector在必须分配新存储空间之前可以存储元素总数创建完vector之后,size和capacity都为0,但是向vector插入元素之后,会发生变化,通常capacity大于等于size,这是vector内存增长机制决定的push_back():向vector最后插入一个元素,在调用push_back时,若当前的capacity已经不能够放入新的元素(capacity=size),那么vector会原创 2021-10-11 16:51:52 · 3438 阅读 · 0 评论 -
[C++] 多态机制的实现原理之虚函数表
什么是多态?程序运行时,父类指针可以根据具体指向的子类对象,来执行不同的函数虚函数实现多态每一个有虚函数的类(或者有虚函数的类的派生类)都有一个虚函数表虚函数表占4个字节类对象存储空间的最前端存放的就是虚函数表的指针该类的任何对象中都放着虚函数表的指针,vptr指针虚函数表是编译器生成的,程序运行时被载入内存一个类的虚函数表中列出了该类的全部虚函数地址举例#include <iostream>using namespace std;class A {public:原创 2021-10-10 15:03:53 · 376 阅读 · 0 评论 -
[C++] 浅拷贝和深拷贝的区别
浅拷贝浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针资源就会出现错误浅拷贝拷贝的仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应的改变#include <string.h>#include <iostream>using namespace std;class Student { private: int num; char原创 2021-10-08 18:53:23 · 1655 阅读 · 0 评论 -
[C++] 类继承中构造函数和析构函数的调用顺序、为什么析构函数要写成虚函数
构造函数的调用顺序:自上而下当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层目标派生类的构造函数析构函数的调用顺序:自下而上当删除一个对象时,首先调用该派生类的析构函数,然后调用上一层基类的析构函数,依次类推,直到到达最顶层的基类析构函数代码演示#include <iostream>using namespace std;class Base { public: Base() { cout << "创建Ba原创 2021-09-12 16:03:39 · 2292 阅读 · 1 评论 -
[算法] 关于十大排序——你真的了解吗
排序算法作为一项需求,足够简单,是学习基础算法思想(分治算法、减治算法、递归)很好的学习材料。面试遇到写排序算法,先问清楚数据的特点,有些时候可能还会给具体的业务场景。时间复杂度时间复杂度统计的是算法的计算操作数量,而不是运行的绝对时间。两者呈正相关,并不相等。算法运行时间受编程语言、计算机处理速度、运行环境等多种因素的影响。体现的是计算操作随数据大小N变化时的变化情况。算法基础知识铺垫稳定排序:如果a原本在b的前面,且a == b,排序之后a仍然在b的前面,则为稳定排序。冒泡排原创 2021-09-08 16:38:23 · 108 阅读 · 0 评论 -
算法与数据结构刷题笔记
数组二分法注意循环不变量二分法是算法面试中的常考题,需要锻炼自己手撕二分算法的能力O(n) 二分法时间复杂度:O(logn)双指针法通过一个快指针和一个慢指针在一个for循环下完成两个for循环的工作csdnO(n^2) 双指针时间复杂度:O(n)C++中vector和array区别一定要清楚,vector底层实现是array,所以vector展现出友好的一些都是因为已经包装过了面试题也需要掌握手撕双指针法滑动窗口O(n^2) 滑动窗口时间复杂度:O(n)根据当前子序列和的原创 2021-09-08 10:09:37 · 250 阅读 · 0 评论 -
[C++] C++输入输出之cin、cin.get()、cin.getline()、getline()的用法
C++输入输出cin用法一:跳过不可见字符(空格、回车、Tab)#include <iostream>using namespace std;int main() { int a; int b; cin >> a >> b; cout << a + b << endl; return 0;}输入:1 回车 2 回车输出:3用法二:不跳过不可见字符(空格、回车、Tab),接受一个原创 2021-08-18 20:57:30 · 173 阅读 · 0 评论 -
[C++] C++之static
局部对象形参和函数体内部定义的变量统称为局部变量局部静态对象令局部变量的生命周期贯穿函数调用以及之后的时间。可以将局部变量定义成static类型局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。代码举例:size_t count_calls() { static size_t ctr = 0;//调用结束后这个值仍然有效 return ++ctr;}如果局部静态变量没有显式的初始化,它将执行值初始化,内置类型的局部静态变量初始化为0原创 2021-08-10 22:18:59 · 110 阅读 · 0 评论 -
[C++] C++11新特性之final和override关键字
final和override说明符出现在形参列表(包括任何const或者引用修饰符)以及尾置返回类型之后override派生类如果定义了一个函数与基类中的虚函数名字相同但是形参列表不同,这仍然是合法的行为编译器将会认为新定义的这个函数与基类中原有的函数相互独立派生类中的函数并没有覆盖掉基类中的函数版本这实际上是一个错误,但是编译器并没有发现这个错误C++11中可以使用override关键字来说明派生类中的虚函数如果派生类中使用了override标记了某个函数,但该函数并没有覆盖基类中已存在的虚原创 2021-08-10 19:38:26 · 252 阅读 · 0 评论 -
[C++] C++11新特性之explicit关键字
参考C++ explicit关键字详解C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。C++中,只有一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。一是构造二是默认且隐含的类型转换操作符所以,在我们写下如 a = b,这样的代码,且恰好b的类型正好是a单参数构造器的参数类型,这时候编译器就自动调用这个构造器,创建一个a的对象。C++中的exp转载 2021-08-10 13:33:54 · 121 阅读 · 0 评论 -
[C++] C++之resize和reserve
改变容器大小,resize增大或者缩小容器array不支持resize如果当前容器大小大于所要求的大小,容器后部的元素会被删除如果当前容器大小小于所要求的大小,会将新元素添加到容器后部vector<int> vec(10, 1);//容器中含有10个1,size为10vec.resize(15);//将5个值为0的元素添加到vec的末尾,size变为15vec.resize(20, 10);//将5个值为10的元素添加到vec的末尾,size变为20vec.resize(5)原创 2021-08-09 15:28:13 · 891 阅读 · 0 评论 -
[C++] C++11新特性之emplace、emplace_back、emplace_front操作
emplace操作C++11新标准引入了三个新成员:emplace、emplace_back、emplace_front,分别对应insert、push_back、push_frontemplace操作构造而不拷贝元素调用push或者insert时,将元素类型的对象传递出去,这些对象被拷贝到容器当中,或者创建一个局部临时对象,并将其压入容器调用emplace时,则是将参数传递给元素类型的构造函数,emplace成员使用这些参数在容器管理的内存空间中直接构造元素,没有拷贝的操作代码举例:#in原创 2021-08-09 14:30:46 · 4286 阅读 · 0 评论 -
[C++] C++之sizeof和strlen
参考C++ Primersizeof运算符sizeof运算符返回一条表达式或者一个类型名字所占的字节数,返回值是size_t类型的常量表达式。size_t是一种机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。sizeof (类型)sizeof 表达式//返回表达式结果类型的大小,sizeof并不实际计算其运算对象的值//定义一个student类型struct student { std::string name; int number = 0;}原创 2021-08-09 10:29:24 · 471 阅读 · 0 评论 -
[C++] C++中的begin和end
容器:begin和end函数begin和end是vector的两个成员函数begin和endbegin:返回指向容器第一个元素的迭代器end:返回指向容器最后一个元素下一个位置的迭代器begin和end返回的具体类型由对象是否是常量决定:如果对象是常量,begin和end返回const_iterator如果对象不是常量,返回iteratorvector<int> v1;const vector<int> v2;auto itr1 = v1.be原创 2021-08-08 17:35:44 · 13947 阅读 · 0 评论 -
[C++] C++之const、constexpr变量、constexpr函数总结
const是一种类型修饰符定义一个变量,它的值不能被改变。比如用一个变量来表示缓冲区的大小。const int size = 128;//const的int类型size = 1;//const对象一旦被创建以后,其值就不能再改变 const int i = get_size();//正确,运行时初始化const int j = 11;//正确,编译时初始化const int k;//错误,k是一个未经初始化的常量const对象必须初始化初始化默认状态下,const对象仅在文件转载 2021-08-08 16:11:16 · 506 阅读 · 0 评论 -
[C++] C++11新特性之左值右值、引用、左值引用右值引用、move、forward
参考C++ PrimerC++ 11 左值,右值,左值引用,右值引用,std::move, std::foward左值右值C++的表达式要么是左值,要么是右值。简单说,左值可以位于赋值语句的左边,右值则不能。右值:当一个对象被用作右值的时候,用的是对象的值(内容),右值要么是字面常量,要么在表达式求值过程中创建的临时对象,没有名字,不能被赋值。左值:当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置),左值就是有名字的对象,可以被赋值,左值可以被取地址,左值持久需要右值的地方原创 2021-08-06 13:59:58 · 210 阅读 · 0 评论 -
[C++] C++11新特性之lambda表达式(匿名函数)、bind函数(函数适配器)、function模板类型(可调用对象包装器)
什么是lambda表达式?一个lambda表达式可以理解为是一个一个未命名的内联函数,也就是可调用的代码单元,即可调用对象。lambda表达式定义立即执行,无需跳出当前函数,可以简化代码,可以把多行代码简化成一行。可调用对象有四种:函数函数指针重载了函数调用运算符的类lambda表达式bind创建的对象与任何函数类似,一个lambda表达式具有:一个返回类型、一个参数列表、一个函数体。与函数不同的是,lambda表达式可定义在函数的内部。lambda表达式的形式[捕获列表转载 2021-08-06 10:22:55 · 409 阅读 · 0 评论 -
[C++] C++11新特性之智能指针shared_ptr和unique_ptr的使用详解
参考C++ Primer 第5版C++11 Smart Pointers直接管理动态内存在C++中,动态内存的管理是通过一对运算符来完成的:new:在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化int *pi = new int;//pi指向一个动态分配的、未初始化的无名对象string *ps = new string;//初始化为空stringint *pi = new int(1024);//pi指向的对象的值为1024string *ps =原创 2021-08-05 11:29:03 · 1213 阅读 · 0 评论 -
哈希表理解(入门必看)
理解哈希表的原理,其核心是理解所谓的哈希函数(散列函数)。即如何构建一个确定的映射,它能把关键字映射到一个唯一的存储位置。这种映射应该是我们可以进行计算的。已知关键字,我们应该能算出其地址;反之,已知地址,我们可以检索到对应的关键字。一旦建立起这种关系,那么给定关键字,我就能直接利用这个映射(即所谓的哈希函数)直接算出其地址并寻址。这可大大缩减确定关键字存储位置所花的时间。 先来了解一下Hash的基本思路: 设...转载 2021-03-05 13:44:30 · 705 阅读 · 0 评论 -
字母数字判断相关的C++内置函数
islower(char c) 是否为小写字母isupper(char c) 是否为大写字母isdigit(char c) 是否为数字isalpha(char c) 是否为字母isalnum(char c) 是否为字母或者数字toupper(char c) 字母小转大tolower(char c) 字母大转小原创 2021-01-21 21:46:57 · 124 阅读 · 0 评论