C++高级
文章平均质量分 60
shenmingik
于现在,对话未来
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++高级 —— 泛型算法
文章目录增强for循环for_each排序算法topK问题:partial_sort和nth_element数据分类:partition查找算法二分查找:binary_search大于等于:lower_bound参考文献c++中的算法是工作在容器上的一些泛型函数,其会对容器内的元素实时各种操作。这篇博客就是记录一些C++提供的常用的算法。增强for循环for_each这个是手写for循环的真正替代品,使用方式见如下代码:#include <iostream>#include <a原创 2021-12-23 16:46:03 · 1111 阅读 · 3 评论 -
C++高级 —— String
文章目录认识String使用String字面量原始字符串字符串转换函数字符串视图参考文献认识Stringstring可以说是我们最常用的类,但是其本质不是一个真正的类,而是一个typedef:using string = std::basic_string<char>;其是basic_string的特化。basic_string是C++为字符串设计的模板类,采用不同的模板搭配不同的字符类型,可以更有弹性的处理各种文字,常见的特化如下:using wstring = std::basi原创 2021-12-23 14:11:15 · 1102 阅读 · 0 评论 -
C++、Python混合编程
文章目录安装C++中的python扩展模块使用C++编写python模块STL适配编写参考文献安装C++中的python扩展模块Python本身有着C接口,可以用C语言编写扩展模块,提供这个扩展的就是pybind11,有了它我们就能使用C++来开发Python扩展了。首先我们需要在centos环境下安装这个库,使用以下命令:sudo yum -y install python3-develsudo yum -y install python3-pippip3 install pytestpip原创 2021-12-19 19:08:57 · 2779 阅读 · 0 评论 -
C++高级 —— 属性
文章目录属性属性Demodeprecatedunusedconstructor && deconsructoralways_inline参考文献属性属性(attribute)是C++中用来控制编译器的编译指令。在C++11之前,非标准的实现中已经出现过属性的申请,比如给gun的__attribute__或者说vc的__declspec。C++11中正式将其纳入标准,其并没有新增关键字,而是采用两对方括号的形式[[...]],中间的…内容就是属性标签。C++中常用的属性标签如下:de原创 2021-12-15 19:31:30 · 3219 阅读 · 2 评论 -
C++高级——探秘对象构造和析构(一)
探秘对象构造和析构首先我们先看我们的类代码:class Test{public: //带一个整型参数的构造函数 Test(int a = 10) :ma(a) { cout << "Test(int)" << endl; } //析构函数 ~Test() { cout << "~Test()" << endl; } //拷贝构造函数 Test(const Test &t) :ma(t.ma) { cout <<原创 2020-07-18 16:56:36 · 1275 阅读 · 0 评论 -
C++高级——探秘对象构造和析构(二)
对象作为参数或者返回值的处理首先来看类的定义:class Test{public: // Test() Test(20) Test(int data = 10) :ma(data) { cout << "Test(int)" << endl; } ~Test() { cout << "~Test()" << endl; } Test(const Test &t):ma(t.ma) { cout <<原创 2020-07-18 20:48:10 · 323 阅读 · 0 评论 -
C++高级——从vector的push_back看move、forward与右值引用
move、forward与右值引用首先看主函数代码:int main(){ CMyString str1 = "aaa"; vector<CMyString> vec; //预留10个空间 vec.reserve(10); cout << "-----------------------" << endl; vec.push_back(str1); vec.push_back(CMyString("bbb")); // move forwor原创 2020-07-20 14:57:04 · 3795 阅读 · 0 评论 -
C++高级——不带引用计数的智能指针(unique_ptr,auto_ptr,scoped_ptr)
智能指针相信大家都忘写过delete或者free?如果你没有诚然,指针的C系语言的优势,但它所带来的的内存泄露问题也是劣势,可谓成也萧何败萧何。所以,C++引入智能指针,利用类对象出作用域析构的特点,将普通指针封装称为智能指针以达到解决内存泄漏的问题。下面是一个智能指针的简单例子:template<typename T>class Csmartptr{public: Csmartptr(T* ptr = nullptr) :mptr(ptr) {} Csmartptr(c原创 2020-07-20 17:04:11 · 705 阅读 · 5 评论 -
C++高级——带引用计数的智能指针(shared_ptr,weak_ptr)
带引用计数的智能指针什么是带引用计数的智能指针,有什么用的?带引用计数的智能指针可以实现多个智能指针管理同一个资源。 通过给每个被管理的资源匹配一个引用计数来实现。当新增一个智能指针指向该资源时,引用计数+1,当减少一个智能指向该资源是,引用计数-1,知道引用计数为0时,资源被释放掉。下面我们就来看一个简单的智能指针的代码:首先是对资源引用计数的类。template<typename T> class RefCnt{public: RefCnt(T *ptr = nullpt原创 2020-07-20 22:36:58 · 975 阅读 · 0 评论 -
C++高级——绑定器及其底层实现
绑定器和函数对象函数对象函数对象就是类方法中有operator()运算符重载的。在使用时和函数很类似。绑定器在C++ STL库中有两个绑定器:bind1st: operator()的第一个形参变量绑定成一个确定的值。bind2nd:operator()的第二个形参变量绑定成一个确定的值。绑定器的使用int main(){ vector<int> vec; srand(time(nullptr)); //初始化容器中的变量 for (int i = 0; i <原创 2020-07-22 13:13:21 · 1129 阅读 · 6 评论 -
C++高级——function应用及底层实现
functionfunction 这个东西我了解也不是很多,如有错误,请大佬们指正。function是一个函数包装器模板,最早来自boost库。在c11标准中将其纳入标准库。该函数包装器模板可以包装任何类型的可调用元素,例如普通函数和函数对象。我老师说,function最大的作用就是保留可调用元素的类型。function的应用我们先随便写几个函数:void hello1(){ cout << "hello world!" << endl;}void hello2原创 2020-07-23 19:58:29 · 2968 阅读 · 4 评论 -
C++高级——bind和function联动实现微线程池
bind昨天有粉丝问我,bind1st和bind有啥区别?今天就来简单讲讲。bind1st和bind2nd在STL中主要用于二元函数对象,将其中的一元绑定成一个固定的量,成为一元函数变量。在C++11标准中,这两位因为不够灵活,所以已经被bind所取代。bind起源于非标准boost库,在c++11标准中正式纳入标准库,其更加灵活,最多可以绑定20个函数对象的参数。bind的用法先随便整上点函数:void hello(string str) { cout << str <原创 2020-07-24 14:10:09 · 525 阅读 · 0 评论 -
C++高级——lambda应用以及实现原理
lambdalambda这个词起源于数学上的λ,在C++中利用lambda表达式,可以方便的定义和创建匿名函数。lambda可以看做函数对象的升级版。改进了函数对象以下的缺点:使用在泛型算法中的参数传递比较性质/自定义操作优先级队列智能指针lambda表达式语法[捕获外部变量](形参列表)->返回值{操作代码};如果lambda不需要返回值,那么返回值可以省略。也就是这样:[捕获外部变量](形参列表){操作代码};捕获外部变量的方式:[]:表示不捕获任何外部变量[=]:以传原创 2020-07-27 14:18:23 · 1636 阅读 · 0 评论 -
C++高级——多线程编程
线程线程是操作系统能够进行运算调度的最小单位。被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程可以并发执行多个线程,每个线程会执行不同的任务。对应在现实生活中,进程是组长,线程是小组成员。怎么创建启动一个线程在语言级别,一般调用std名称空间的thread类来启动一个线程。其对应操作系统层次的一下系统调用:windows: createThreadlinux:pthread_create以下是thread类的一个构造函数:template <原创 2020-07-28 18:51:14 · 3449 阅读 · 6 评论 -
初识C++并发编程
何谓并发最简单和最基本的并发,是指两个或更多独立的活动同时发生。在计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。要注意:并行和并发是两个概念!在计算机系统中,并行是通过时间片轮转来使得两个程序想同时运行一样。并发和并行的区别:当然,真正的并发不可能是一个任务不断的去占用一个核心,而是像下图一样的。通过时间片,让同一任务在不同的核心上运行:并发的途径进程:将应用程序分为多个独立的进程,它们在同一时刻运行,就像同时进行网页浏览和文字处理一样。进程通信原创 2020-09-22 17:25:31 · 357 阅读 · 0 评论 -
第三方库——JSON介绍与使用
JSON介绍Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简介和清晰的层次结构使得Json成为理想的交换格式。易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。Json是一个优秀的第三方库。其中JSON OF MODERN C++是由德国大牛nlohmann编写的,所以命名空间的名字也是nlohmann。Json的特点直观的语法整个代码由一个头文件组成,没有子项目,使用方便使用C++ 11标准编写使用原创 2020-10-08 19:18:43 · 1852 阅读 · 0 评论 -
C++ 11——保持C99兼容性
保持与C99兼容预定义宏我们可以使用以上宏来查验机器环境对C标准和C库的支持状况://由于每个机器都不同,所以我在这里用xxxx来泛指#include <iostream>using namespace std;int main(){ cout<<"Standard Clib:"<<__STDC_HOSTED__<<endl; //print: Standard Clib:XXXX cout<<"Standard C:"<原创 2020-11-23 12:50:29 · 561 阅读 · 0 评论 -
C++ 11——保持稳定性与扩展
long long 整型相比于C++ 98,C++ 11整型最大的改变就是多了 long long。long long整型有两种:long long 和 unsigned long long。在C++ 11中,标准要求 long long 整型可以在不同平台上有不同的长度,但至少要有64位。我们可以在赋值的时候使用LL后缀来标识 long long类型的字面量,或者ULL 表示一个unsigned long long 类型的字面量。long long int a = 9000000000000000L原创 2020-12-06 14:54:44 · 402 阅读 · 0 评论 -
C++ 11——继承和委派构造函数
继承构造函数C++ 中自定义类型——类,是C++ 面向对象的基石。类具有可派生性,派生类可以自动获得基类的成员变量和接口。不过基类的非虚函数则无法再被派生类使用了。如果派生类 要使用基类的构造函数,同城需要在构造函数中显示声明,但是这也带来一个问题:有的时候,我们的基类可能拥有数量众多的不同版本的构造函数,其派生类去构造基类的时候就需要写大量的“透传”构造函数。struct A{ A(int i){} A(double d,int i){} A(float f,int i, const cha原创 2020-12-07 20:48:31 · 520 阅读 · 2 评论 -
C++ 11——右值引用:移动语义与完美转发
目录指针成员与拷贝构造移动语义左值、右值与右值引用指针成员与拷贝构造平常我们写代码都必须注意一条规则:在类中包含一个指针成员的话,那么就要特别小心拷贝构造函数的编写,因为一不小心就容易造成内存泄漏。以下代码乍一看是没啥问题的,但是在b析构之后,a就成了悬挂指针!#include <iostream>using namespace std;class HasPtr{public: int *d; HasPtr():d(new int(0)){} HasPtr(const H原创 2020-12-08 20:41:40 · 392 阅读 · 0 评论 -
C++设计模式——单例模式
文章目录单例模式两种单例模式饿汉式懒汉式参考文献单例模式很多时候,我们在程序设计的时候,对于某一类只需要生成其中一个对象。比如说对于MySQL数据库类来说,如果频繁的创建MySQL对象,那么会有海量的连接连接到MySQL数据库,对数据库来说是一个不小的负担。但其实对于开发者来说,一个连接其实就能胜任与数据库的交互工作,这就是单例模式。两种单例模式而对于单例模式来说,又分为两种:懒汉式、饿汉式两种单例模式:懒汉式: 当获取实例对象时,对象才产生饿汉式: 还没有获取实例对象时,对象已经产生了原创 2021-02-01 17:59:50 · 391 阅读 · 0 评论 -
C++设计模式——简单工厂、工厂方法、抽象工厂
文章目录工厂模式简单工厂工厂方法抽象工厂参考文献工厂模式首先要了解的就是工厂模式是啥,在工厂模式中,开发者是消费者,他们不用知道产品的生产细节,生产细节全在工厂中实现就是工厂模式。而整个工厂模式有三种:简单工厂、工厂方法、抽象工厂假设我们有宝马BWM以及奥迪Audi及其系列产品,那么我们就从这些产品的生产来说明这三种工厂的区别://系列产品1class Car{public: Car(string name) :name_(name) {} virtual void show() = 0原创 2021-02-01 19:27:08 · 373 阅读 · 0 评论 -
C++设计模式——代理模式
文章目录代理模式参考文献代理模式代理模式应用场景一般都是,一个类提供所有的功能,但是它对不同客户开放不同功能。一般这个时候我就用 if 了,但是为了更好的设计,让代码不至于一团糟,我还是用设计模式吧。代理模式通过设计功能类的代理类来达成不同访问权限的目的。就拿腾讯视频为例,有免费电影、VIP电影以及用券电影。class VideoSite{public: virtual void free_movie() = 0; virtual void vip_movie() = 0; virtual原创 2021-02-01 20:01:52 · 378 阅读 · 0 评论 -
C++设计模式——装饰器模式
文章目录装饰器模式参考文献装饰器模式装饰器模式简单来说就是通过一个装饰器,不断的去增强基类的现有功能,而不是去扩充子类。举个例子:还是原来的汽车例子,有宝马BWM和奥迪Audi两个车class Car{public: virtual void show() = 0;};class BWM :public Car{public: void show() { cout << "this is BWM Car" << endl; }};class Audi原创 2021-02-01 20:32:22 · 222 阅读 · 0 评论 -
C++设计模式——适配器模式
文章目录适配器模式参考文献适配器模式适配器模式其实主要就是在原有接口和现有接口不匹配的情况下去增加一个适配器类,匹配两种不同的接口。比如说:投影仪Project有VAG和HDMI以及Type-C等多种接口,在前些年,投影仪和电脑的接口都是VAG,无疑,直接连接就可:class VGA{public: virtual void play() = 0; string getType() const { return "VGA"; }};//投影仪class Project :public原创 2021-02-01 20:44:36 · 352 阅读 · 3 评论 -
C++设计模式——观察者模式
文章目录观察者模式参考文献观察者模式这种设计模式,一般有多个待观察对象和一个观察者,待观察者对象通过告诉观察者自己感兴趣的事件,观察者把待观察者以及其感兴趣的事件存储起来(可以用unordered_map),观察者观察到此事件就会告诉待观察者。这有点像Redis中间件和回调函数的机制。enum Obj_type{ OBJECT1 = 1, OBJECT2, OBJECT3,};class Base {public: virtual void func() {}};class原创 2021-02-01 20:50:39 · 324 阅读 · 0 评论
分享