【学习笔记】C++
文章平均质量分 69
古正风
与其心生敬佩,不如自己便是那样。
展开
-
【C++】【刷题】实战应用——海量数据的查重及top K问题
基本单位换算:1G=》1024*1024*1024=》1 000 000 000=》10亿10亿整数=》1G整数=》1G*4字节=》4GB(32位int占4字节,int*4字节,64位int4字节,int*8字节)50亿整数=》5G整数=》5G*4字节=》20GB(32位)海量数据查重/去重有一组IP地址、URL、字符串,哪些有重复,重复了多少次,去除重复的考虑类似这种问题,主要有以下思路:哈希表 + 分治思想:哈希表增删查O(1),但是占空间大,10亿个整数,大约占4GB,用哈希表存k.原创 2022-04-27 13:19:14 · 518 阅读 · 2 评论 -
【C++】【刷题】实战应用——大数加减
题目背景大数用内置类型是存不下的,32位操作系统中int最大存储2^31-1 = 2147483647,long:2147483648 ,logn long:9223372036854775807所以一般用字符串来存储非常大的数据请实现以下类的方法,完成大数的加减法#include <iostream>#include <string>#include <algorithm>using namespace std;//题目:请实现以下类的方法,完原创 2022-04-27 13:16:42 · 425 阅读 · 2 评论 -
【C++】【刷题】实战应用——DFS与BFS搜索迷宫路径及迷宫最短路径
题目背景请输入迷宫的行列数(例如:5 5)请输入迷宫的路径信息(0表示可以走,1表示不能走):0 0 0 1 11 0 0 0 11 1 0 1 11 1 0 0 11 1 1 0 0迷宫路径搜索中...>>>如果没有路径,直接输出<<<不存在一条迷宫路径!>>>如果有路径,直接输出<<<* * * 1 11 0 * 0 11 1 * 1 11 1 * * 11 1 1 * *深度优先遍历进行搜索DF原创 2022-04-27 13:13:41 · 639 阅读 · 2 评论 -
【C++】C++11新特性
委托构造函数C++11 标准提出了委派构造函数新特性。利用这个特性,程序员可以将公有的类成员构造代码集中在某一个构造函数里,这个函数被称为目标构造函数。其他构造函数通过调用目标构造函数来实现类成员构造,这些构造函数被称为委派构造函数。在该新特性提出之前,构造函数是不能显式被调用的,委派构造函数打破了这一限制class CGoods{public: CGoods():CGoods("\0", 0, 0, 0) //: CGoods("\0", 0) {} { } CGoods(string原创 2022-04-26 14:13:01 · 894 阅读 · 2 评论 -
【C++】语言级别的多线程操作(线程库、互斥量、条件变量)
线程库头文件头文件#include <thread>命名空间std创建线程示例#include <thread>void fun(){ //do some work}int main(){ std::thread t(fun); t.join();}在 上例 中,函数 fun将会运行于线程对象 t 中, join 函数将会阻塞main线程, 直到 t 线程执行结束注意:std:: thread 出了 作用域之后将会析 构, 这时如果线程函数还原创 2022-04-26 13:45:45 · 182 阅读 · 2 评论 -
【C++】右值引用、移动语义、完美转发、引用折叠
问题的引入如果有的应用场景必须返回的是定义过的对象,也必须按赋值的方式来接收函数调用,那优化的后两条规则就用不成了解决办法:给该类添加一个右值引用拷贝构造函数,函数内部不做资源的分配,而是资源的转移,每当有通过右值(临时对象)来构建对象的时候,就调用右值引用拷贝构造函数右值引用左值:有名字或有内存右值:没名字(临时量)或没内存int main(){ int a=10; int &b=a; // ok int &c=10; //error, 1原创 2022-04-24 13:10:19 · 895 阅读 · 2 评论 -
【C++】对象使用过程中背后调用的方法以及对象优化
对象使用过程中背后调用的方法C++编译器对于对象构造的优化,用临时对象生成新对象的时候,临时对象不产生了,直接构建新对象用临时对象赋值给已存在的对象的时候,要产生临时对象,再调用operator=构造函数完成类型转换,(构造函数强转详细可查看博客:C++:构造函数强转、参数列表)临时对象生存周期:所在的语句而引用就是别名,相当于给这块内存又给了个名字,所以用引用引用临时对象,临时对象的生命周期就变成引用变量的生命周期了所以用指针指向临时变量是不安全的,而用引用引用临时对象是安全的程序运行原创 2022-04-24 13:02:29 · 1055 阅读 · 2 评论 -
【C++】C++语言级别提供的四种类型转换方式
C类型强转int a = (int)b;C++语言级别提供的四种类型转换方式const_cast : 去掉(指针或者引用)常量属性的一个类型转换static_cast : 提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了)reinterpret_cast : 类似于C风格的强制类型转换dynamic_cast : 主要用在继承结构中,可以支持RTTI类型识别的上下转换代码示例:class Base{public: virtual void原创 2022-04-20 13:43:10 · 145 阅读 · 2 评论 -
【C++】虚基类、虚继承、菱形继承
虚基类、虚继承**多重继承:**一个派生类有多个基类,代码复用好处:更多代码的复用坏处:菱形继承问题:派生类有多份间接共同基类,解决方案:虚继承虚基类内存布局:在原来的基础上,把虚基类移到最后面,原来基类位置补一个虚基类指针vbptr0、8是偏移量菱形继承class A{public: A(int data) :ma(data) { cout << "A()" << endl; } ~A() { cout << "~A()" <&原创 2022-04-20 13:30:15 · 451 阅读 · 2 评论 -
【C++】一文搞懂STL
C++ STL standard template libaray 标准模板库,学习底层原理和增删改查的使用,容器的底层数据结构有什么样的优缺点,容器就有什么样的优缺点allocator容器中,对象的构造析构,内存的开辟释放是通过容器的空间配置器allocator来实现的,allocator有四个函数:allocate:开辟内存deallocate:释放内存construct:构造对象destroy:析构对象一、标准容器C++11新加容器: array forward_list(单向链原创 2022-04-19 18:11:10 · 2062 阅读 · 2 评论 -
【C++】STL泛型算法和绑定器
五、泛型算法和绑定器泛型算法泛型算法是STL库里面定义的一些算法,这些算法可以用一个接口操作各种数据类型,因此称为泛型算法template + 迭代器 + 函数对象泛型算法详细介绍在C++ Primer 3rd末尾附录泛型算法头文件#include <algorithm> //包含了C++ STL里面的泛型算法泛型算法特点:泛型算法的参数接收的都是迭代器,为什么?因为泛型算法是给所有容器都能使用的,要通用参数还可以接收函数对象,功能可以更改,例如sort可递增排序,也原创 2022-04-19 17:57:00 · 118 阅读 · 2 评论 -
【C++】STL函数对象
三、函数对象(类似C的函数指针)函数对象 =》 C语言里面的函数指针使用C的函数指针实现比大小效率低的问题template<typename T>bool mygreater(T a, T b){ return a > b;}template<typename T>bool myless(T a, T b){ return a < b;}template<typename T, typename Compare>bool co原创 2022-04-19 17:54:39 · 561 阅读 · 2 评论 -
【C++】STL迭代器
二、迭代器vec.begin(); //返回首元素迭代器vec.end(); //end返回容器末尾元素的后继位置注意迭代器失效问题:对容器进行连续插入或者删除操作(insert/erase),一定要更新迭代器,否则第一次insert或者erase完成,迭代器就失效了1) 正向迭代器:容器类名::iterator 迭代器名;vector<int>::iterator it;auto it = vec.begin();2) 常量正向迭代器容器类名::const_ite原创 2022-04-19 17:51:16 · 463 阅读 · 2 评论 -
【C++】STL标准容器之关联容器
一、标准容器3、关联容器主要分为两类:set:集合,存的是关键字keymap:映射表存的是 [key,value]键值对常用增删查方法:增加:insert(val);遍历:iterator自己搜索或调用find成员方法,unordered_set<int>::iterator it = set1.find(15); cout << *it;删除:erase(key) erase(it)3.1、无序关联容器 => 链式哈希表无序关联容原创 2022-04-19 17:47:54 · 441 阅读 · 2 评论 -
【C++】STL标准容器之容器适配器
一、标准容器2、容器适配器标准容器 - 容器适配器怎么理解适配器?容器适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法全部由底层依赖的容器进行实现的,如下Stack代码,它的底层就是deque,相当于将deque适配成一个Stack没有实现自己的迭代器template<typename T, typename Container=deque<T>> class Stack{public: void push(const T & v原创 2022-04-19 17:42:04 · 726 阅读 · 2 评论 -
【C++】STL标准容器之顺序容器
C++ STL standard template libaray 标准模板库,学习底层原理和增删改查的使用,容器的底层数据结构有什么样的优缺点,容器就有什么样的优缺点原创 2022-04-18 13:15:00 · 623 阅读 · 2 评论 -
【C++】进程的虚拟地址空间内存划分和布局以及函数调用堆栈详细过程
进程的虚拟地址空间内存划分和布局 任何的编程语言产生两种东西:指令和数据,下图是对x86 32位linux环境下而言的用户空间3G,内核空间1G所以进程之间通信可以通过共享的内核来通信:匿名管道、信号量函数调用堆栈详细过程int sum(int a, int b){ int temp = 0; temp = a + b; return temp;}int main(){ int a = 10; int b = 20; int ret = sum(a, b); cout原创 2022-04-18 13:02:54 · 355 阅读 · 2 评论 -
【C++】单例模式和观察者模式
单例模式(创建型)创建型模式:提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例比如日志模块,数据库模块,任务管理器饿汉式单例模式还没有获取实例对象,实例对象就已经产生了,饿汉式是线程安全的优点:程序加载时就进行实例化,之后的操作效率会很高。缺点: 由于程序加载时就进行实例化,如果后续不对此类进行任何操作,就会导致内存的浪费原创 2022-04-17 17:10:36 · 462 阅读 · 2 评论 -
【C++】文件操作
C++文件操作在程序运行时产生的数据都是临时数据,程序一旦运行结束就会被释放。通过文件可以将数据持久化。操作文件的三大类:ofstream写文件ifstream读文件fstream读写文件一、写文件写文件步骤如下:包含头文件#include创建流对象ofstream ofs;打开文件ofs.open(“文件路径”,打开方式);写数据ofs<<“写入的数据”;关闭文件ofs.close();#include<iostream>#inclu原创 2021-07-31 22:58:04 · 173 阅读 · 1 评论 -
【C++】多态实现简单计算机类
C++多态实现简单计算机类普通写法实现计算器类//普通写法#include<iostream>#include<string>using namespace std;class Calculator{public: int getResult(string oper) { if (oper == "+") { return m_Num1 + m_Num2; } else if (oper == "-") { return m_原创 2021-07-30 17:28:57 · 664 阅读 · 0 评论 -
【C++】一文搞懂智能指针
智能指针基本概念头文件memory智能指针的->运算符重载不带引用计数的智能指针为什么智能指针要区分带引用计数或不带引用计数呢?因为多个智能指针指向同一份资源会引起资源的重复释放,即浅拷贝资源释放的问题,所以有的不带引用计数,但是只能有一个智能指针指向该份资源,有的带引用计数auto_ptrauto_ptr怎么解决浅拷贝资源多份释放的问题?答:永远让最后一个auto_ptr指向该份资源,前边的auto_ptr被置为nullptr,图示如下:所以auto有很多缺点:不推荐使用原创 2022-04-17 16:56:30 · 579 阅读 · 2 评论