![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 55
基础知识
code-016
有问题请私信,停更一段时间。
展开
-
【C++】模板元编程栗子
一、题目描述使用c++提供的模板编程,将二进制数转换成十进制二、代码template<size_t N>class BinToDec {public: static const int value = BinToDec<N / 10>::value * 2 + N % 10;};template<>class BinToDec<0> {public: static const int value = 0;};int main(原创 2022-05-29 18:50:30 · 190 阅读 · 0 评论 -
【C++多线程】银行多人转账模拟
文章目录一、题目要求二、代码实现一、题目要求使用C++的线程并发库,实现并模拟多人在线同时转账的过程,确保转账不能出现差错。例如:Account A(“xiaoming”, 1000);Account B(“zhangqiang”, 2000);Account C(“zq”, 1500);B->A 200 A 1200 B 1800B->c 500 B 1300 C 2000C->A 300 A 1500 C 1700二、代码实现#if 1#inclu原创 2022-05-03 17:00:43 · 1277 阅读 · 0 评论 -
【C++多线程】生产者消费者模型
文章目录一、题目要求二、解答三、题目要求四、解答(1)行锁(2)表锁一、题目要求生产者消费者模型:在多线程下生产0~100个数,生产者线程1生产20个数据后,消费者线程1进行消费输出。二、解答使用到的技术:互斥锁、条件变量、多线程、双端队列#if 1#include<iostream>#include<deque>#include<mutex>#include<condition_variable>using namespace std原创 2022-04-29 19:41:26 · 1700 阅读 · 0 评论 -
【C++】线程同步二(条件变量+互斥锁)
文章目录题目:使用三个线程依次输出ABC(1)介绍RAII包装类unique_lock(2)介绍条件变量(3)代码实现题目:使用三个线程依次输出ABC(1)介绍RAII包装类unique_lock(2)介绍条件变量温馨提示:linux下的条件变量(3)代码实现#include <iostream>#include <thread>#include <mutex>using namespace std;//实现三个线程输出ABC ...#if 1原创 2022-03-18 19:09:51 · 341 阅读 · 0 评论 -
【C++】线程同步一
文章目录一、线程同步题(1)原子操作(2)互斥锁(3)RAII包装类管理互斥锁一、线程同步题两个线程同时对一个全局变量++操作,保证最后的结果正确(1)原子操作#include <iostream>#include <thread>#include <mutex>#include <atomic>using namespace std;//线程同步一:两个线程同时对一个全局变量++操作,保证最后的结果正确//原子全局变量atomic_i原创 2022-03-18 18:36:26 · 2011 阅读 · 0 评论 -
【C++】引用叠加规则
转载 2022-03-18 13:29:07 · 405 阅读 · 0 评论 -
【C++】std::move()仿写
文章目录一、关于std::move()二、仿写std::move一、关于std::move()原理:将一个左值强制类型转成一个纯右值二、仿写std::move//去除引用特性template<class _Ty>struct my_remove_reference{ using type = _Ty;};template<class _Ty>struct my_remove_reference<_Ty&>{ using type原创 2022-03-17 23:20:49 · 169 阅读 · 0 评论 -
【C++】类型转换
文章目录关于四种类型转换1. 使用场景(1)static_cast<新类型>(表达式)(2)const_cast<新类型>(表达式)(3)reinterpret_cast<新类型>(表达式)(4)dynamic_cast<新类型>(表达式)2. 优点关于四种类型转换1. 使用场景(1)static_cast<新类型>(表达式)适用于不去除常量性(const)和异变性(mutable)的场合; 就是普通的类型转换int a = 10;原创 2022-03-17 21:39:47 · 618 阅读 · 0 评论 -
【C++】不同模板对象之间赋值
代码:#include <iostream>using namespace std;template<class _Ty>class object{public: _Ty _val;public: object(_Ty val = 0) : _val(val) {} template<class other> object& operator=(const object<other>& src) { if (th原创 2022-03-17 17:07:40 · 508 阅读 · 0 评论 -
【C++】编程识别普通指针和智能指针
文章目录一、模板特化类一、模板特化类普通指针和智能指针的最大区别就是,智能指针是一个对象类型,而普通指针是一个指针类型,通过这一点,我们便可以使用通用模板和特化模板类进行区分,从而达到目的。#include <iostream>#include <memory>using namespace std;//普通对象版本template<class T>struct mybool{ static const bool result = true;};/原创 2022-03-17 16:11:41 · 493 阅读 · 0 评论 -
【C++】STL中deque底层剖析
文章目录一、关于deque二、底层结构(1)deque迭代器(2)deque结构(3)内存结构图一、关于dequestd::deque ( double-ended queue ,双端队列)是有下标顺序容器,它允许在其首尾两端快速插入及删除。另外,在 deque 任一端插入或删除不会非法化指向其余元素的指针或引用。与 std::vector 相反, deque 的元素不是相接存储的:典型实现用单独分配的固定大小数组的序列,外加额外的登记,这表示下标访问必须进行二次指针解引用,与之相比 vector 的原创 2022-03-17 15:41:24 · 1014 阅读 · 0 评论 -
【C++】SGI二级空间配置器(内存池)
文章目录一、二级空间配置器中的内存池结构(1)内存池初始状态(2)当外界使用内存池二、流程分析三、使用中的内存池四、完整代码(1)类型萃取(2)迭代器(3)一、二级空间配置器(4)构造、析构一、二级空间配置器中的内存池结构(1)内存池初始状态(2)当外界使用内存池my_list.h#include"my_alloc.h" #include"my_iterator.h"#include"my_construct.h" #ifndef MY_LIST_H#define MY_LIST_原创 2022-03-16 17:40:43 · 284 阅读 · 0 评论 -
【C++】SGI一级空间配置器
文章目录一、SGI的alloc一、SGI的alloc一级配置器:使用malloc / free二级配置器:申请/释放空间使用手段> 128字节使用一级配置器malloc / free<= 128字节使用使用内存池memory pool注意:二级配置器有可能会使用一级配置器。...原创 2022-03-13 21:13:37 · 1526 阅读 · 1 评论 -
【C++】空间配置器(construct、destroy)
文章目录一、类型萃取实现对象构建、析构(1)Object.h(2)my_iterator.h(3)my_type_traits.h(4)my_construct.h二、construct、destroy测试模块(1)有关紧要的析构(2)无关紧要的析构一、类型萃取实现对象构建、析构(1)Object.h#ifndef OBJECT_H#define OBJECT_H#include <iostream>using namespace std;#if 1template<cl原创 2022-03-12 16:24:20 · 1034 阅读 · 0 评论 -
【C++】类型萃取实现迭代器操作
文章目录一、关于迭代器操作二、关于迭代器三、实现advance四、实现distance一、关于迭代器操作这里主要实现这两个函数的具体实现原理:类型萃取实现函数重载,从而达到不同类型容器中的迭代器都可以进行使用该函数advance和distance函数。并且不同的迭代器类型可以使用不同的方法,从而提高效率(例如随机迭代器正向移动5下,可以使用循环,也直接可以 += 5,很明显随机迭代器使用后者效率将O(n)提到了O(1))。二、关于迭代器迭代器按照功能可分为五类:输入迭代器、输出迭代器、向前迭原创 2022-03-12 01:14:38 · 749 阅读 · 0 评论 -
【C++】类型萃取
文章目录一、类型萃取二、通过类型萃取实现函数重载一、类型萃取笔者目前以这种使用场景来解释什么是类型萃取,为什么需要类型萃取?看代码会更加明了。Demo.h#ifndef DEMO_H#define DEMO_H//为什么需要萃取器?//自设计的模板Object<_Ty>类型template<class _Ty>class Object{private: _Ty value;public: Object(_Ty val = 0) : value(val)原创 2022-03-11 01:47:01 · 1852 阅读 · 0 评论 -
【C++】vector和list比较
原创 2022-03-09 18:25:38 · 238 阅读 · 0 评论 -
【C++】STL中vector容器使用总结
文章目录一、vector(1)区分size()和capacity()(2)迭代器失效(3)区分const_iterator和const iterator(4)区分reserve()和resize()(5)push_back和emplace(6)关于原位构造(定位new + 完美转发)一、vector(1)区分size()和capacity()size():返回容纳的元素个数capacity():返回当前分配存储的容量(2)迭代器失效(3)区分const_iterator和const it原创 2022-03-09 17:13:41 · 218 阅读 · 0 评论 -
【C++】shared_ptr的环状引用问题
文章目录一、环状引用二、环状引用内存结构三、解决方案weak_ptr四、weak_ptr环形引用结构图(1)构造过程(2)析构过程一、环状引用举个栗子:#include <iostream>#include <memory>//环形引用class B;class A{public: shared_ptr<B> _b; A() { cout << "A()" << endl; } ~A() { cout << "~原创 2022-03-08 22:37:52 · 1603 阅读 · 3 评论 -
【C++】STL中shared_ptr和weak_ptr
文章目录一、shared_ptr的内存结构二、删除器三、引用计数四、shared_ptr仿写五、关于weak_ptr六、weak_ptr与shared_ptr关联内存结构七、weak_ptr仿写一、shared_ptr的内存结构结构解释:_Ptr和_Ref分别保存存放在堆区空间的被管理对象和引用计数结构引用计数结构中的_rptr也保存被管理对象的地址。_Users记录shared_ptr指针管理对象的个数_Weaks记录weak_ptr管理对象的个数二、删除器//单个对象删除器tem原创 2022-03-08 15:01:39 · 689 阅读 · 0 评论 -
【C++】STL中shared_ptr仿写一
文章目录一、关于shared_ptr二、shared_ptr对象内存结构三、仿写代码一、关于shared_ptr定义于头文件 template< class T > class shared_ptr;//(C++11 起) std::shared_ptr 是通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存:最后剩下的占有对象的 shared_ptr 被销毁;最后剩下的占有对象的 shared_ptr原创 2022-03-07 17:50:27 · 305 阅读 · 0 评论 -
【C++】unique_ptr问题补充
文章目录关于使用unique_ptr作为函数返回值(1)写法(2)写法(3)错误写法(4)错误写法总结关于使用unique_ptr作为函数返回值(1)写法#include<iostream>#include<memory>using namespace std;unique_ptr<int> fun(int x){ unique_ptr<int> tmp(new int(x)); return tmp;}int main(){ int原创 2022-03-06 21:02:17 · 678 阅读 · 1 评论 -
【C++】STL中unique_ptr
文章目录一、关于unique_ptr二、相关解释一、关于unique_ptrC++11标准引入唯一性智能指针unique_ptr,是通过指针占有并管理另一对象,并在unique_ptr离开作用域时自动释放该对象的智能指针。定义于头文件单对象一般版本:template<class T, class Deleter = std::default_delete<T>> class unique_ptr;数组特化版本template <class T, clas原创 2022-03-06 16:52:39 · 456 阅读 · 0 评论 -
【C++】STL中被弃用的auto_ptr
文章目录一、关于auto_ptr二、实现auto_ptr三、auto_ptr被C++11弃用,C++17移除的原因一、关于auto_ptrC++11标准前STL中就有了auto_ptr, 是通过由 new 表达式获得的对象,并在 auto_ptr 自身被销毁时删除该对象的智能指针。它可用于为动态分配的对象提供异常安全、传递动态分配对象的所有权给函数和从函数返回动态分配的对象。二、实现auto_ptr代码:#include<iostream>using namespace std;原创 2022-03-05 20:41:33 · 480 阅读 · 0 评论 -
【C++】菱形继承和虚继承
文章目录一、菱形继承二、虚继承一、菱形继承二、虚继承原创 2022-03-05 15:20:11 · 296 阅读 · 0 评论 -
【C++】类模板继承问题
文章目录一、情况一二、情况二一、情况一#include<iostream>using namespace std;template<class _Ty>class Base{private: _Ty val;public: Base(_Ty x = _Ty()): val(x) { }public: static int num;};template<class _Ty>int Base<_Ty>::num = 0;cl原创 2022-03-05 13:37:12 · 158 阅读 · 0 评论 -
【C++】完美转发
完美转发(perfect forwarding) 是指函数模板在向其他函数传递参数时该如何保留该参数的左右值属性的问题。也就是说函数模板在向其他函数传递自身形参时,如果相应实参是左值,它就应该被转发为左值;同样如果相应实参是右值,它就应该被转发为右值。这样做是为了保留在其他函数针对转发而来的参数的左右值属性进行不同处理(比如参数为左值时实施拷贝语义;参数为右值时实施移动语义)的可能性。如果将自身参数不分左右值一律转发为左值,其他函数就只能将转发而来的参数视为左值,从而失去针对该参数的左右值属性进行不同转载 2022-03-05 13:12:09 · 502 阅读 · 0 评论 -
【C++】纯虚函数和抽象类
文章目录一、纯虚函数(1)语法(2)虚函数表二、抽象类三、接口类一、纯虚函数(1)语法virtual 返回类型 函数名(形参列表) = 0;(2)虚函数表class Base{private: int val;public: Base(int x = 0): val(x){} ~Base(){} virtual void fun() = 0; virtual void show()const {cout << val << endl;}};二、抽象原创 2022-03-05 00:05:32 · 67 阅读 · 0 评论 -
【C++】free delete delete[]注意事项
文章目录一、尽量配套使用二、原因一、尽量配套使用申请释放mallocfreenew()deletenew[]delete[]二、原因我们举例说明:class Test{private: int num;public: Test(int x = 0): num(x){} ~Test(){}};(1)申请一个Test()Test* tp = new Test();内存模型...原创 2022-03-04 23:30:51 · 161 阅读 · 0 评论 -
【C++】C语言实现继承和多态
文章目录一、C语言实现继承二、C语言实现多态(1)静态多态(2)动态多态一、C语言实现继承原理:结构体组合类//基类typedef struct Base{ //基类自身属性和方法 int b_val = 0; void show() { printf("b_val:%d\n", b_val); }}Base;typedef struct Son{ //隐藏基类对象 Base base; //派生类自身属性和函数 int s_val = 10; void show()原创 2022-03-04 17:27:16 · 2700 阅读 · 0 评论 -
【C++】虚表指针和虚函数表
文章目录一、虚表指针和虚函数表定义二、虚函数表生成三、虚表指针的内存模型四、虚表指针的设置过程1. 构造过程2. 析构过程一、虚表指针和虚函数表定义虚表指针:指向虚函数表首地址的一个指针,存在于每个基类对象的内存中,在调用构造函数构造对象时,设置虚表指针__vfptr虚函数表:在编译阶段生成,编译器将类中虚函数的地址存放在虚函数表中,虚函数表存在于全局数据区.data,每个类仅有一个,供所有对象共享。二、虚函数表生成我们已经清楚虚函数表是在编译期间生成的,那我们详细看看虚函数表的生成过程吧,原创 2022-03-04 13:50:57 · 3115 阅读 · 0 评论 -
【C++】虚函数与多态
文章目录一、虚函数二、多态一、虚函数类成员方法(除过构造函数)前使用virtual关键字,将函数声明成虚函数。类外实现函数的定义无需在前加virtual关键字。class Person{public: virtual void work() { cout << "工作" << endl; }};二、多态静态多态:编译期间就已经确定函数的调用时机(函数重载、运算符重载)动态多态:运行时确定函数的调用时机动态多态触发条件:公有继承中基类含有虚函数&原创 2022-03-04 12:19:41 · 172 阅读 · 0 评论 -
【C++】继承中对象构造与析构、赋值重载
文章目录一、构造/析构顺序及继承性二、拷贝构造的继承性三、赋值重载不具有继承性一、构造/析构顺序及继承性class A{private: int _a;public: A(int a = 0): _a(a) { cout << "A()" << this << endl; } ~A() { cout << "~A()"<< this <<endl; }};class B : public A{p原创 2022-03-03 19:58:51 · 264 阅读 · 0 评论 -
【C++】继承中同名隐藏和赋值兼容规则
文章目录一、继承中同名隐藏(1)同名成员属性(2)同名成员方法二、赋值兼容规则一、继承中同名隐藏(1)同名成员属性class A{public: int _a;};class B : public A{public: int _a; //这个_apublic: void fun() { _a = 10; //就近原则 A::_a = 20; //加上作用域访问 }};(2)同名成员方法class A{public: void fun(){ cout原创 2022-03-03 18:18:45 · 386 阅读 · 0 评论 -
【C++】继承中的权限
文章目录一、默认权限二、默认继承权限(1)class 继承 struct(2)struct 继承 class三、继承权限探究(1)公有继承(2)私有继承(3)保护继承四、继承和派生类中定义基类成员权限的区别一、默认权限struct 默认公有权限struct A{public:};class 默认私有权限class B{private:};二、默认继承权限(1)class 继承 structstruct A{};class B : A{}; //默认私有继承(2)str原创 2022-03-03 17:27:23 · 2342 阅读 · 8 评论 -
【C++】STL中list容器仿写
#ifndef LIST_H#define LIST_Hnamespace pzj{ template<class T> void swap(T v1, T v2) { T tmp = v1; v1 = v2; v2 = tmp; } //_Ty值类型 template<class _Ty> class List { public: //设计节点类型 struct _Node; typedef struct _Node* _Nodept原创 2022-03-03 14:46:51 · 391 阅读 · 0 评论 -
【C++】运算符重载
(一)不可重载的运算符(二)运算符重载语法函数名:类型 operator运算符(){}(三)重载++#include <iostream>using namespace std;class Int{ int val;public: Int() :val(0) {} Int(int value) { val = value; } //缺省拷贝构造 Int(const Int& src):val(src.val){} //缺省的赋值运算符重载原创 2022-01-18 16:54:42 · 277 阅读 · 0 评论 -
【C++】数组的引用
引用数组:就是对数组进行引用#include <iostream>using namespace std;int main(){ int arr[5] = {1, 2, 3, 4, 5}; int (&b)[5] = arr; //b就是arr数组的引用 return 0;}通过b来打印arr中的元素:void Print(int(&b)[5]){ for (int i = 0; i < 5; ++i) { cout <<原创 2022-01-18 12:51:38 · 3143 阅读 · 1 评论 -
【C++】拷贝构造函数
文章目录(一)拷贝构造函数(二)浅拷贝的问题(三)解决方案(1)深拷贝的拷贝构造函数(2)引用计数技术(四)总结(一)拷贝构造函数同一个类的对象在内存中拥有相同的结构,若作为整体拷贝是可以的。但我们知道,同一个类的方法是所有该类的对象共用的。所以只需要拷贝数据成员。拷贝构造函数的功能就是专门拷贝数据成员的函数。拷贝构造函数的作用:当使用一个成员对象初始化一个对象时,会调用该函数来构造对象(二)浅拷贝的问题当析构使用缺省的拷贝构造函数(浅拷贝)构造的对象和被拷贝的对象时(有堆区空间),在两次de原创 2022-01-13 15:47:41 · 188 阅读 · 0 评论 -
【C++】引用实现双向函数
文章目录(一)题目描述(二)引用实现(三)考虑常对象情况(一)题目描述如何使用一个函数实现SetValue和GetValue的功能?#include <iostream>using namespace std;class Obj{public: Obj():value(0) {} void SetValue(int val) { value = val; } int GetValue() { return value; }private: int valu原创 2022-01-10 19:33:48 · 224 阅读 · 0 评论