![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++
1
live4m
老菜逼了
展开
-
[cpp32 note] 5. 容器2
cpp17后提供了std::size()方法,可以获取c数组的长度。并且在数组退化时使用会编译报错。array保留了c数组在栈上分配的特点,还提供了begin、end、size等通用成员函数。作为参数时有退化行为,传递后函数内部无法获得c数组长度和结束位置。c数组没有良好的复制行为,无法作为map之类容器的key。array还支持作为map的key。没有size成员函数。原创 2023-04-05 19:12:26 · 81 阅读 · 0 评论 -
[cpp32 note] 4. 容器1
vector的主要缺陷是大小增长内存重分配导致的开销,可以用reverse函数预留所需的内存,再vector很大的时候效果明显。cpp11之前没有移动构造,大小增长导致内存重分配时会拷贝元素到新的内存空间。依赖于某个现有容器的容器类,例如queue和stack。的移动构造函数,就会移动元素到新的内存空间。容器适配器,默认用deque实现。容器适配器,默认用deque实现。cpp11之后如果有。原创 2023-04-05 04:40:13 · 76 阅读 · 0 评论 -
[cpp32 note] 3. 右值和移动
void bar(T&& s)中,T&&的作用主要是保持值类别进行转发,也叫转发引用(forwarding reference)。这里的ptr1是左值引用,std::move的作用是将左值引用转变为右值引用,std::move(ptr1)的结果是指向ptr1的一个右值引用。很多标准库里的函数,连目标的参数类型都不知道,但仍然能保持参数的值类别:左值的仍然是左值,右值的仍然是右值。如果T是左值引用,那么T&&的结果仍是左值引用,即(type&)&&右值引用变量,实际上是一个左值,因此会匹配到左值引用上。原创 2023-04-05 01:08:35 · 79 阅读 · 0 评论 -
常量和字面量的区别
【代码】常量和字面量的区别。原创 2023-03-28 00:56:16 · 82 阅读 · 0 评论 -
[cpp32 note] 2. 实现cpp智能指针 (2)
上面的代码还不允许子类指针circle* 隐式转换成基类指针shape* ,原创 2023-03-26 16:50:51 · 57 阅读 · 0 评论 -
[cpp32 note] 2. 实现cpp智能指针 (1)
(cpp里如果提供了移动构造,那么拷贝构造是默认禁用的,不需要再显式禁用)上面的实现其实很不合理,因为没有显式的告诉你拷贝会转移指针所有权,分成两步是为了防止在拷贝的过程中出现异常,导致当前对象收到影响。目前的代码,在拷贝时会赋值对象指针,有内存释放两次的隐患,这里的赋值分为拷贝构造和swap两步。在使用时容易不小心把指针传走了。将上一节的RAII代码模板化,异常只可能出现在拷贝构造部分。原创 2023-03-26 14:03:15 · 77 阅读 · 0 评论 -
[cpp32 note] 0. 为什么要学习cpp
cpp32原创 2023-03-26 00:52:58 · 121 阅读 · 2 评论 -
[cpp32 note]1. 堆、栈、 RAII:cpp里应该如何管理资源
在内存管理的背景下,堆指的是动态内存分配的区域,这里的内存在分配后需要手动释放,否则会造成内存泄漏。gcc和clang中提到frame的,如-fomit-frame-pointer,就是指栈帧。对于有构造函数的析构函数的非POD类型,在栈上的内存分配也同样有效;cpp编译器会在生成代码的合适位置,插入对构造函数和析构函数的调用。特指使用new和delete分配和释放资源的区域,一般是堆的子集。cpp独有的内存管理机制。主流的编程语言中,cpp是仅有的。栈空间中,每个函数占用的栈空间成为栈帧。原创 2023-03-26 02:28:55 · 100 阅读 · 0 评论 -
c++ 宏编写技巧
c++宏编写技巧。原创 2022-07-16 20:07:18 · 451 阅读 · 0 评论 -
map中[]和find的区别
1.map的下标运算符[ ]将key为下标去执行查找,并返回对应的值;如果key不存在,就将key用默认值初始化2.map的find函数用key执行查找,找到了返回该位置的迭代器;如果key不存在,就返回尾迭代器原创 2022-07-13 23:55:54 · 744 阅读 · 0 评论 -
unordered_map的at方法
unordered_map.at()原创 2022-07-13 00:44:11 · 1483 阅读 · 0 评论 -
#pragma once
# pragma once原创 2022-07-05 23:52:26 · 669 阅读 · 1 评论 -
c++:mt19937生成随机数
随机生成:int rd(){ mt19937 rd1(time(NULL)); return rd1();}指定随机数的生成范围:int rd(){ mt19937 rd1(time(NULL)); uniform_int_distribution<int>t(0,100000);//指定范围 return t(rd1);}原创 2021-06-02 00:08:52 · 888 阅读 · 0 评论 -
静态库和动态库的区别
静态库和动态库的区别:静态库:程序编译时会被整合到目标代码中,程序运行时不再需要静态库。动态库:程序编译时不会整合到目标代码中,而是在程序运行时被载入,因此在程序运行时还需要动态库的存在。...原创 2021-02-19 08:56:50 · 89 阅读 · 0 评论 -
c++:atoi,stoi(),字符串转十进制数
atoi()的参数是const char*。stoi()的参数是const string。原创 2021-02-18 22:10:37 · 192 阅读 · 0 评论 -
c++:to_string(),十进制数转字符串
十进制数转字符串:string to_string (int val);string to_string (long val);string to_string (long long val);string to_string (unsigned val);string to_string (unsigned long val);string to_string (unsigned long long val);string to_string (float val);stri原创 2021-02-18 21:47:59 · 788 阅读 · 1 评论 -
c++:map和unordered_map的区别
map和unordered_map的区别:map底层是红黑树,有自动排序功能,复杂度稳定O(log)。unordered_map底层是哈希表,没有排序功能,复杂度O(1),最坏情况下O(n)。原创 2021-02-18 04:55:33 · 103 阅读 · 0 评论 -
c++:vector的push_back时间复杂度分析
vector是如何增长的:为了支持快速随机访问,vector是连续存储的。当添加一个新元素时,如果没有空间容纳新元素,为了保持连续存储,容器必须分配新的内存空间保存已有元素和新元素。转移流程:申请新空间,转移元素,释放旧空间。为了避免每次添加元素都需要转移一次空间,当需要扩容时,vector会申请一个比需求更大的内存空间,即预留一部分空间作为备用。push_back复杂度分析:push_back均摊后的时间复杂度为O(1)。vector只有当达到capacity之后才会扩容。设倍增因子为m.原创 2021-02-17 09:54:48 · 3582 阅读 · 0 评论 -
c++:构造函数和析构函数可以是虚函数吗?
构造函数:构造函数不可以是虚函数。当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表用于存储成员函数指针。当存在虚函数时,每个对象都有一个指向虚函数表的指针vptr,该指针存放在对象的内部空间中,需要调用构造函数完成初始化。如果构造函数时虚函数,那么调用构造函数就需要先找vptr,但此时vptr还没初始化,发生冲突。析构函数:析构函数可以是虚函数。虚表vtable以及初始化,所以完全可以将析构函数放到虚表中。当类有继承时,析构函数必须是虚函数。如果不是虚函数,那么可能导致内存泄.原创 2021-02-17 10:12:09 · 599 阅读 · 0 评论 -
c++ new和malloc的区别
c++ new和malloc的区别:1.new在申请空间的时候会调用构造函数,而malloc不会。对于自定义类型,new会先调用operator new函数,申请内存(底层申请内存是malloc),然后调用构造函数,最后返回自定义类型的指针。2.new申请失败时返回bad_alloc,而malloc返回NULL。3.new是c++关键字,需要编译器支持,而malloc是库函数,需要添加头文件4.new在申请内存的时候不用指明大小,编译器会根据类型自动计算,而malloc需要显式的指明内存.原创 2021-02-16 11:02:42 · 164 阅读 · 0 评论 -
c++ 数组和指针的区别
c++ 数组和指针的区别:1.数组保存数据;指针保存数据的地址。2.数组直接访问数据;指针间接访问数据(先获得指针内容作为数据地址,再从该地址中提取数据)。3.数据常用于固定数量且数据类型相同的一组数据;指针常用于动态数据结构。4.数组内存的分配和释放是隐式的;指针需要通过malloc和free分配和释放内存。5.数组的数据名就是数组名字;指针通常指向匿名数据、操作匿名函数。...原创 2021-02-14 16:20:37 · 283 阅读 · 0 评论 -
c++ map的count方法
map的底层是红黑树,容器中不会出现相同的key,因此map.count(key)的结果只能为0和1,可以用于来判断key是否存在。map.count(key)的返回值与val无关,就算存在(key,0),也会返回1。原创 2021-02-08 17:10:38 · 1509 阅读 · 0 评论 -
VS2019 MFC编译错误:#error Please use the /MD switch for _AFXDLL builds
问题:起因:将自己的MFC项目丢到别人电脑,.exe点击显示没mfc140d.dll等dll文件,移完dll文件之后也没用,查询资料之后发现需要将使用动态链接库修改为静态库编译.好多地方只写了下面两项中的其中一项,结果我这边没用,最后我歪打正着两个一起就解决了.解决方法:项目->属性->高级->高级属性中 ‘MFC的使用’ 一项修改为 ‘在静态库中使用MFC’:同时,C/C++ ->代码生成 -> ‘运行库’ 一项修改为 ‘多线程调试(/MTd)’实测原创 2021-01-04 16:52:55 · 2573 阅读 · 0 评论 -
VS2019中使用函数strcpy_s(char*,CString)显示没有与参数列表匹配的重载函数..........
问题:报错位置:strcpy_s(pwd1, temp);报错信息:没有与参数列表匹配的 重载函数 "strcpy_s" 实例解决方法:点击VS2019中的项目->属性->配置属性->高级->将字符集从(使用Unicode字符集)改为(使用多字节字符集)...原创 2020-12-31 16:58:30 · 2168 阅读 · 0 评论 -
c++指针和引用的区别
1.指针占用4字节的空间(sizeof(指针)=4),引用只是被引用对象的别名(sizeof(引用)=被引用对象的大小).2.原创 2021-01-05 12:41:52 · 117 阅读 · 0 评论 -
c++虚函数和纯虚函数的区别
定义一个函数为虚函数,是为了允许基类指针通过动态绑定调用子类函数.虚函数的函数体已经被实现.定义一个函数为纯虚函数,那么这个函数体没有被循实现,因为函数没有被实现,所以子类必须再实现该函数之后才能使用.包含纯虚函数的类是抽象类,无法生成实例对象,只有实现了纯虚函数的子类才可以生成实例对象.纯虚函数如果在子类中被实现,那么在子类中就是虚函数而不再是纯虚函数.引入纯虚函数是因为(一个例子):假设有动物类,子类有猫和狗,他们都有一个函数"叫()",猫可以叫和狗的叫不同,因此叫函数的实现不同,但.原创 2021-01-01 19:45:56 · 186 阅读 · 0 评论 -
c++获取系统时间并转为用CString存储的datetime型
code:/*mysql的日期是datetime型,插入的时候可以用满足datetime格式的字符串(年-月-日 时:分:秒),CTime获取系统时间,但是获取的是每个位置(年,月,日...)的数字,可以配合CString的Format方法使用,这样就能用CString存datetime了.*/#include <atltime.h>CTime t = CTime::GetCurrentTime();CString time;time.Format("%d-%02d-%02d原创 2021-01-03 16:05:41 · 728 阅读 · 0 评论 -
C++连接MYSQL数据库
//下面的代码是一个实现C++连接MYSQL数据库的很好的例子//这里用了建表,插入,检索,删表等常用功能//我用VC++6.0生成,已经成功连接了。//在VC++6.0中要想把做一下两步准备工作才可以。//(1)Tools->Options->Directories->Include files中添加C:\Program Files\MySQL\MySQL Server 6.0\include//(2)Tools->Options->Directories->.转载 2020-12-27 11:29:09 · 122 阅读 · 0 评论