C++
文章平均质量分 75
学习C++笔记,在不同的内容中穿插各种详细知识点
悲伤土豆拌饭
做一个cool guy
展开
-
C++ 可变参数模板
可变参数模板C++11 增强了模板功能,在C++11之前,类模板和函数模板只能含有固定数量的模板参数,现在C++11中的新特性可变参数模板允许模板定义中包含0到任意个模板参数,可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”省略号的作用有两个:声明一个参数包,这个参数包中可以包含0到任意个模板参数在模板定义的右边,可以将参数包展开成一个一个独立的参数template<class ... T>vo原创 2022-05-02 20:24:10 · 2188 阅读 · 0 评论 -
C++ 可调用对象
可调用对象概念可调用对象包装器——std::functionstd::bind 绑定器概念在C++中,存在“可调用对象”这么一个概念,准确来说,可调用对象有如下几种定义:是一个函数指针是一个具有operator()成员函数的类对象(仿函数)是一个可被转换为函数指针的类对象是一个类成员(函数)指针void func() { cout << "func" << endl;}struct Foo{ void operator()() { cout <原创 2022-05-02 19:37:41 · 1339 阅读 · 0 评论 -
C++ ThreadPool
线程池半同步半异步线程池半同步半异步线程池再处理大量并发任务的时候,如果按照传统的方式,来一个任务请求,对应一个线程来处理请求任务,大量的线程创建和销毁将消耗过多的系统资源,还增加了线程运行环境切换的开销,而通过线程池技术就可以很好地解决这些问题;线程池技术通过再系统中预先创建一定量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理完任务之后还可以重用,不会销毁,而是等待下次任务的到来这样,通过线程池能避免大量的线程创建和销毁动作,从而节省系统资源,这样做的一个好处是,对于原创 2022-05-02 11:03:09 · 1849 阅读 · 0 评论 -
C++ STL概述
STLSTL概述STL概述STL是”Standard Template Library“的缩写,中文译为”标准模板库“;STL是C++标准库的一部分,不用单独安装C++对模板(Template)支持的很好,STL就是借助模板把常用的数据结构及算法都实现了一遍,并且做到了数据结构和算法的分离;例如,vector的底层为顺序表(数组),list的底层为双向链表,deque的底层为循环队列,set的底层为红黑树,unordered_map(hash_map)的底层为哈希表STL包含:容器类各种数据原创 2022-04-30 19:58:55 · 228 阅读 · 0 评论 -
C++ 对象池 ObjectPool
template<class _Ty>class ObjectPool{ enum { nPollSize = 4 }; //最多三个对象protected: struct _Node { _Node* next; }; _Node* front; //头 _Node* rear; //尾private: void ReFillPool() //填充 { size_t total = sizeof(_Node) + sizeof(_Ty); for (in原创 2022-04-30 19:49:03 · 1354 阅读 · 0 评论 -
C++ 对象与对象的关系
对象与对象的关系依赖关联聚合在一个系统中,一个对象可能与不同的对象相关,以下是不同的关系依赖(Dependency)使用一个关联(Association)使用一个聚合(Aggregation)有一个组合(Composition)有一个,“用…来实现”继承(Inheritance)是一个类模板(Class template)依赖依赖(Dependency):使用一个class Book{};class Food{};class Human{public: void Read原创 2022-04-30 15:38:35 · 1285 阅读 · 0 评论 -
C++ Thread 信号量
信号量信号量实现生产者消费者MySemaphore信号量实现生产者消费者int g_num = 0;std::binary_semaphore semp(1);std::binary_semaphore sems(0);void P(int i){ for (int i = 0; i < 10; ++i) { semp.acquire(); //1 -> 0 P操作 g_num = i; cout << "P:" << g_num &l原创 2022-04-28 18:57:13 · 1376 阅读 · 0 评论 -
C++ Thread 死锁
死锁死锁示例如何解决死锁死锁示例线程A与线程B陷入无休止的阻塞状态std::mutex mx1;std::mutex mx2;void thread_func1(){ unique_lock<std::mutex> lc1(mx1); cout << "1号锁" << endl; std::this_thread::sleep_for(std::chrono::microseconds(200)); unique_lock<std::mut原创 2022-04-27 17:18:23 · 756 阅读 · 0 评论 -
C++ Thread 生产者消费者模式
生产者消费者模式锁的粒度双端队列生产者消费者模式const int MAX_ITEM = 20;std::mutex mx;std::condition_variable cv;class Queue{public: Queue() {} ~Queue() {} void put(int val, int index) { std::unique_lock<std::mutex> lock(mx); while (q.size() == MAX_ITEM)原创 2022-04-26 18:29:34 · 599 阅读 · 0 评论 -
C++ Thread
Thread 线程库线程的创建detach 句柄独立线程资源转移sleep_ for全局函数线程化joinablehardware_concurrency线程的互斥原子操作定义互斥锁try_lockrecursive_mutex 递归锁线程的创建void funa(){ cout << "funa()" << endl;}void funb(int a){ cout << "funb(int a)" << endl;}void func(i原创 2022-04-26 11:11:31 · 3333 阅读 · 0 评论 -
C++ C11新特性
C11新特性move移动构造如何实现未定义类型C++ 类型强转模板编译分裂性move移动构造如何实现class MyString{ char* str;public: MyString(const char* p = NULL) :str(NULL) { if (p != NULL) { int len = strlen(p) + 1; str = new char[len]; strcpy_s(str, len, p); } } MyString(const原创 2022-04-25 17:38:34 · 433 阅读 · 6 评论 -
C++ 空间的配置与释放 std::alloc
空间配置与释放第一级配置器第二级配置器对象建立前的空间配置,和对象析构后的空间释放,由<stl_alloc.h>负责,SGI对此的设计哲学如下:向 system heap 系统堆空间申请考虑多线程情况考虑内存不足的情况考虑过多小块的内存可能造成内存碎片的问题C++ 的内存分配动作是 ::operator new(),而内存的释放动作是::operator delete()来进行,我们在设计过程中,这两个函数由C的malloc()和free()函数代替,因为 ::operator原创 2022-04-25 08:50:28 · 539 阅读 · 0 评论 -
C++ 模板中的问题
区分模板函数区分裸指针与智能指针通过特化模板进行区分template<class T>struct my_class{ my_class<T>(); static const bool value = true;};template<class T>struct my_class<T*>{ my_class<T>(); static const bool value = false;};template<class原创 2022-04-24 20:39:09 · 313 阅读 · 0 评论 -
C++ 迭代器萃取
迭代器萃取迭代器型别迭代器类型迭代器萃取迭代器型别value type 值类型,是指迭代器所知物件的型别difference type 相差型别,表示两个迭代器之间的距离reference type 引用类型,从迭代器所指之物的内容是否允许改变pointer type 指针类型,迭代器所指之物的地址iterator_category 迭代器的相应型别迭代器类型Input Iterator 只读迭代器Output Iterator 可写迭代器Forward Iterator 正原创 2022-04-22 11:05:05 · 387 阅读 · 0 评论 -
C++ lambda表达式
lambdalambda 表达式简介lambda 表达式的基本概念和基本用法lambda 表达式简介lambda表达式是C++11最重要也最常用的一个特性之一,其实在C#3.5中就引入了lambda,Java8中也引入了lambda表达式lambda 来源于函数式编程的概念,也是现在编程语言的一个特点,有如下优点:声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者对象,以更直接的方式去写程序,好的可读性和可维护性简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和原创 2022-04-21 12:42:56 · 10513 阅读 · 2 评论 -
C++ STL map set
mapmap 简介unordered_map 无序mapmap 的插入multimap 多重mapmap 输出findequal_rangeset 容器map 简介map底层由排序二叉树,也就是红黑树实现我们来看一段示例代码,通过map统计string中各字符串出现的次数int main(){ string stra[] = { "map","deque","queue","vector","list","map","vector","map" }; std::map<string,原创 2022-04-21 10:35:19 · 1051 阅读 · 0 评论 -
C++ STL duque
duquedeque 简介deque 的布局deque 和 vector 的区别deque 简介deque 是由一块一块的固定大小的连续空间构成(块与块之间是不连续),一旦有必要在deque的前端或尾端增加新的空间,便配置一块固定大小的连续空间,串联在整个duque的头端或尾端deque的最大任务,便是在这些分块的固定大小连续空间上,维护其整体连续的假象,并提供随机存取的接口(随机迭代器),代价则是迭代器架构较为复杂deque采用一块所谓的_M_map(注意,不是STL的map容器)作为主控,这里所原创 2022-04-20 13:41:26 · 561 阅读 · 0 评论 -
C++ STL list
Listlist 的介绍list 的使用list 的创建访问、push_front、erase、unique、removelist 与 vector 的区别总结list 的介绍list是序列容器,允许在序列中的任何位置执行固定O(1)时间的插入和删除操作,并在两个方向上进行迭代list容器使用双链表实现,双链表将每个元素存储在不同的存储位置,每个节点通过next,prev指针链接成顺序表list与其他基本标准序列容器(array、vector和deque)相比,list通常在容器内的任何位置插入、原创 2022-04-20 12:35:16 · 428 阅读 · 0 评论 -
C++ STL vector
vectorvector简介vector 的使用初始化operator[] 与 at 对容器元素访问reserve 、 resize 、assignpush_back、insertemplace_back 原位构造vector简介vector 是表示可以改变大小的数组的序列容器vector 与数组一样,元素使用连续的存储空间,就可以使用常规指针,指向其元素,使用偏移量来访问存储空间中的元素vector 与数组不同的是,vector 的大小可以动态变化,容器会自动扩容存储空间vector 使用一个原创 2022-04-19 17:16:07 · 590 阅读 · 0 评论 -
C++ 菱形继承
菱形继承的介绍,以及虚继承和菱形继承虚函数表问题原创 2022-04-18 17:38:02 · 1751 阅读 · 0 评论 -
C++ 完美转发
完美转发用来解决模板函数调用参数左值右值的问题原创 2022-04-18 11:02:58 · 1111 阅读 · 0 评论 -
C++ 抽象工厂
抽象工厂 抽象工厂创建 智能指针管理工厂 隐藏业务工厂抽象工厂创建原创 2022-04-18 09:13:08 · 903 阅读 · 0 评论 -
C++ 智能指针的两种创建方式
两种创建方式std::shared_ptr<Object> op1(new Object(10));std::shared_ptr<Obejct> op2 = std::make_shared<Object>(20);这样两种不同的智能指针构建方式,其内存结构是不同的对于第一种方式来说,op1有一个ptr指针和一个删除器(mDeletor),ptr指针指向引用计数对象(RefCnt),引用计数对象有mptr指针和引用计数(ref),mptr直指向Object对象原创 2022-04-17 11:47:27 · 3472 阅读 · 0 评论 -
C++ weak_ptr弱引用智能指针
弱引用智能指针的使用,以及循环引用问题的解决原创 2022-04-16 22:47:10 · 799 阅读 · 3 评论 -
C++ 共享智能指针
共享智能指针的介绍,以及实现方式原创 2022-04-15 10:28:33 · 1527 阅读 · 0 评论 -
C++ 智能指针和工厂模式
工厂模式简介与示例原创 2022-03-31 18:53:59 · 1552 阅读 · 0 评论 -
C++ 智能指针
RAII(Resource Acquisition Is Initialization)是由C++之父提出的,中文翻译为资源获取即初始化,使用局部对象来管理资源的技术称为资源获取即初始化;这里的资源主要是指操作系统中有限的东西如内存(heap)、网络套接字、互斥量、文件句柄等等,局部对象是指存储在栈的对象,它的生命周期是由操作系统来管理的,无需人工介入原创 2022-03-30 14:50:30 · 1212 阅读 · 0 评论 -
C++ 设计模式 简单工厂模式
介绍简单工厂模式,以及实例与使用场景原创 2022-03-28 22:26:32 · 1782 阅读 · 0 评论 -
C++ 继承与多态 续
继承与多态动态联编动态联编联编是指计算机程序自身彼此关联的过程,是把一个标识符名和一个存储地址联系在一起的过程,也就是把一条消息和一个对象的操作相结合的过程如果使用基类指针或引用指明派生类对象并使用该指针调用虚函数(成员选择符用箭头号“->”),则程序动态地(运行时)选择该派生类的虚函数,称为动态联编;动态联编亦称滞后联编如果使用对象名和点成员选择运算符 “.” 引用特定的一个对象来调用虚函数,则被调用的虚函数是在编译时确定的(称为静态联编)...原创 2022-03-28 15:57:10 · 613 阅读 · 0 评论 -
C++ 多态与虚函数
多态性与虚函数多态性虚函数多态性多态性是面向对象程序设计的关键技术之一,若程序设计语言不支持多态性,不能称为面向对象的语言,利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能在C++中有两种多态性:编译时的多态通过函数的重载和运算符的重载来实现的运行时的多态性运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定;它是通过类继承关系public和虚函数来实现的,目的也是建立一种通用的程序;通用性是程序原创 2022-03-26 20:03:50 · 1559 阅读 · 0 评论 -
C++ 继承与多态
继承与多态介绍继承的概念与定义介绍继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员保持原有类特性的基础上进行扩展,增加功能;这样产生新的类,称派生类;继承呈现了面向对象程序设计的层次结构;体现了由简单到复杂的认识过程多态性是考虑在不同层次的类中,以及在统一类中,统么的成员函数之间的关系问题。函数的重载,运算符的重载,属于编译时的多态性;以虚基类为基础的运行时的多态性是面向对象程序设计的标志性特征;体现了类推和比喻的思想方法早期绑定:编译时就确定了调用关系晚绑定:程序运行的过原创 2022-03-23 17:43:50 · 2349 阅读 · 0 评论 -
C++ 实现List
list的C++实现,迭代器、插入、删除、列表构造等内容原创 2022-03-19 19:58:05 · 2363 阅读 · 0 评论 -
typedef 与 #define 的区别
在这里我们写两段程序typedef int* PINT;int main(){ int a = 10,b = 20; const PINT p = &a; *p = 100; //A p = &b; //B}#define SINT int*int main(){ int a = 10,b = 20; const SINT p = &a; *p = 100; //A p = &b; //B}对于宏定义,仅仅是将关键词进行原创 2022-03-17 16:52:43 · 327 阅读 · 0 评论 -
C++实现MyString拓展
对之前写过的Sting类进行补充,以及拓展,新加了功能与方法原创 2022-03-16 01:20:24 · 306 阅读 · 0 评论 -
C++ 函数模板与类模板
C++模板函数,推演以及泛化与部分特化和完全特化原创 2022-03-04 17:05:36 · 875 阅读 · 0 评论 -
C++ 单例模式
单例模式的实现线程安全模式饿汉模式原创 2022-03-04 14:39:42 · 257 阅读 · 0 评论 -
C++ 静态成员
探讨类中的静态成员变量,或静态函数原创 2022-03-01 16:44:47 · 574 阅读 · 0 评论 -
C++ 友元
私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。而友元就是:让一个函数或者类 访问另一个类中的私有成员;打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。原创 2022-03-01 14:38:14 · 510 阅读 · 0 评论 -
C++右值引用
右值引用,通过MyString来分析右值引用,并且延伸了柔性数组以及写时拷贝的内容原创 2022-02-17 07:20:13 · 1356 阅读 · 0 评论 -
C++实现MyString
MyString的实现,构造、拷贝构造、等号运输、加号运算、输出流等原创 2022-02-11 02:26:55 · 1950 阅读 · 0 评论