C++奇技淫巧
文章平均质量分 60
INGNIGHT
这个作者很懒,什么都没留下…
展开
-
boost::intrusive_ptr的用法
链接:https://www.jianshu.com/p/dd9701219b27。商业转载请联系作者获得授权,非商业转载请注明出处。作者:JasonLiThirty。原创 2024-01-30 23:29:48 · 499 阅读 · 0 评论 -
vector实现
【代码】vector实现。原创 2023-10-04 11:41:43 · 49 阅读 · 0 评论 -
string cow方法实现
【代码】string cow方法实现。原创 2023-10-02 23:00:35 · 755 阅读 · 0 评论 -
内存池/对象池设计与实现
2.栈,使用最近归还的对象,进行对象池对象分配。1.new 重载placement new。3.静态对象需要在类外进行初始化。原创 2023-08-07 16:10:43 · 210 阅读 · 0 评论 -
包装器function
模板函数是一个通用的函数适配器(绑定器),它用一个可调用对象及其参数,生成一个新的可调用对象,以适应模板。:需要绑定的可调用对象(可以是前两节课介绍的那六种,也可以是。:绑定参数列表,可以是左值、右值和参数占位符。,如果参数不是占位符,缺省为值传递,原创 2023-08-06 09:11:08 · 130 阅读 · 0 评论 -
set_union并集和set_intersection交集
1.set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())用来求两个集合的并集(去重)//最后一个参数不可用c.begin(),否则会无法运行,也不可令it=set_union(。//最后一个参数不可用c.begin(),否则会无法运行,也不可令it=set_union(。//加速cin,和cout。cout<<"c中元素个数:"<<c.size()<<endl;cout<<"c中元素个数:"<<c.size()<<endl;原创 2023-07-29 18:14:12 · 428 阅读 · 0 评论 -
lambda表达式捕获模式的陷阱分析和演示
#include <iostream>#include <functional>#include <algorithm>using namespace std;vector<std::function<bool(int)>> gv;void myfunc() { srand((unsigned)time(nullptr)); int tempvalue = rand() % 6; gv.push_back(.原创 2020-08-29 15:03:50 · 432 阅读 · 0 评论 -
lambda表达式for_each,find_if简介
#include <iostream>#include <functional>#include <algorithm>using namespace std;class CT {public: int m_i = 5; void myfuncpt(int x, int y) { auto mylambda1 = [this, &x, y]() { // 无论是 x = 5; y; .原创 2020-08-19 22:56:06 · 706 阅读 · 0 评论 -
可调用对象、std::function、std::bind
可调用对象、std::function、std::bind原创 2020-08-14 20:08:23 · 185 阅读 · 0 评论 -
extern “C“那些事
转载:https://light-city.club/sc/basic_content/extern/#extern-c1.C++与C编译区别在C++中常在头文件见到extern "C"修饰函数,那有什么作用呢? 是用于C++链接在C语言模块中定义的函数。C++虽然兼容C,但C++文件中函数编译后生成的符号与C语言生成的不同。因为C++支持函数重载,C++函数编译后生成的符号带有函数参数类型的信息,而C则没有。例如int add(int a, int b)函数经过C++编译器生成.o文件后,转载 2020-07-12 18:13:13 · 337 阅读 · 0 评论 -
静态库与共享库
一、头文件和库文件1、在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。2、库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)和数据库访问例程(dbm库)等。二、头文件与库文件位置1、usr/include及...原创 2020-03-09 22:14:38 · 260 阅读 · 0 评论 -
Google Perf Tools安装以及使用
Google Performance Tools安装以及使用这边文章都记录在github:https://github.com/NIGHTFIGHTING/gperftools-tutorial一个优化的内存管理算法—tcmalloc性能优于malloc。一个用于CPU profile的工具,用于检测程序的性能热点,这个功能和gprof类似。一个用于堆检查工具,用于检测程序在是够有内存泄露...原创 2020-03-09 00:40:47 · 2170 阅读 · 0 评论 -
模板(三)
#ifndef __INCLUDE_STACK_H__#define __INCLUDE_STACK_H__#include #include #include #include #include using namespace std;template >class Stack{ public: Stack(); ~Stack()原创 2016-05-11 15:11:19 · 398 阅读 · 0 评论 -
迭代器失效
1.序列式容器迭代器失效1.1对于序列式容器:vector,queue等,序列式容器就是数组式容器,删除当前的iterator会使得后边所有元素的iterator都失效。这是因为其使用了连续分配的内存,阐述一个元素导致后面所有的元素都会向前移动一个位置,所以不能使用erase(iter++)的方式。但是erase方法可以返回下一个有效的iterator// 正确for (iter ...转载 2019-08-20 12:21:12 · 222 阅读 · 0 评论 -
STL源码剖析-map
1.容器rb_treeRed-Black tree(红黑树)是平衡二元搜寻树(balanced binary search tree)中常被使用的一种平衡二元搜寻树的特点:排列规则有利于search和insert,并保持适度平衡-无任何节点过深rb_tree提供遍历操作以及iterators按正常规则(++ite)遍历,便能获得排序状态(sorted)我们不应该使用rb_tree的...原创 2019-08-20 00:34:22 · 662 阅读 · 2 评论 -
STL源码剖析-vector
1.vector扩容 (1)每次扩容是原来capacity的2倍,申请内容,将原内容copy到新内存.这些操作会影响到程序运行的效率,所以reserve()操作(提前分配一定量的内存)来避免不必要的重新分配是很有必要的(2)每次扩容都有元素的大量拷贝工作,...原创 2019-08-19 23:45:46 · 188 阅读 · 0 评论 -
_GNUC__宏函数
今天在看Linux系统编程这本书的代码的时候看到了GNUC,不太清楚这个宏所以去查了一下,以此记录。GNU C预定义了一系列的宏,这些宏都是以双下划线开始的,这里只讲一下GNUC GNUC_MINOR GNUC_PATCHLEVEL,其他GNU C的预定义宏可以到这里查看:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/cpp/Common-Predefin...转载 2018-05-13 16:42:04 · 3287 阅读 · 0 评论 -
数值算法
1.accumulatetemplate class InputIterator, class T> T accumulate (InputIterator first, InputIterator last, T init){ while (first!=last) { init = init + *first; // or: init=binary_op(init原创 2017-06-12 10:47:43 · 374 阅读 · 0 评论 -
STL算法示例
1.移除性算法remove首先查找给定值第一个位置,然后遍历后面的元素,将非移除元素拷贝到前面,覆盖前面的元素。#include #include #include #include using namespace std;void print_element(int n) { cout << n << " ";}int main(void) { int a[]原创 2017-05-22 15:10:26 · 371 阅读 · 0 评论 -
shared_ptr使用场景、陷阱、性能分析,使用建议
1.std::shared_ptr使用场景#include <iostream>#include <memory>using namespace std;shared_ptr<int> create0(int value) { return make_shared<int>(value); // 返回一个shared_p...原创 2019-08-20 20:35:56 · 9694 阅读 · 0 评论 -
单例设计模式共享数据分析、解决,call_once
一、设计模式大概谈“设计模式”:代码的一些写法,与常规的写法不太一样,程序灵活,维护起来很方便,但是别人接管、阅读代码很痛苦。用“设计模式”理念写出来的代码很晦涩。<< head first>>老外应付特别大的项目时候,把项目开发经验、模块划分经验,总结成设计模式。(现有开发需求,后有理论总结和整理)设计模式拿到中国来,不太一样,拿着一个程序(项目)往设计模...原创 2019-08-24 21:50:28 · 214 阅读 · 0 评论 -
static使用
一、static定义三个complex对象,c1,c2,c3,三个对象中的非静态成员(non-static data members)分别有三份,其余的静态数据成员,非静态成员函数(通过this pointer区分不同的对象),静态成员成函数只有一份。什么时候要使用静态函数?静态函数没有this pointer,静态函数只能处理静态数据静态数据要在类外面初始化/定义(变量获得内存)...原创 2019-08-25 00:36:42 · 130 阅读 · 0 评论 -
仿函数functors
一、仿函数仿函数一个class里面重载小括号(),function core operator。仿函数创建的对象是函数对象,是一个对象,像一个函数,function object。仿函数只为算法服务。map的实现中,<key,data>组成一个pair,获得key使用select1st函数二、仿函数只为算法服务三、仿函数functors的可适配(adap...原创 2019-08-25 13:00:48 · 146 阅读 · 0 评论 -
c++标准库算法
一、c++标准库算法,是什么东西(1)算法需要知道当前处于什么容器,可以帮助算法找到当前最有效率的动作。算法问迭代器问题。(2)算法形式第二版本,Cmp是一个criteria准则,比如排大小,是一个functors(3)算法与容器没有关联,通过iterator管理,各自闭门造车、二、各种容器的iterator_categoryrandom是可以跳跃的,连续空间可以跳跃r...原创 2019-08-25 13:13:39 · 1046 阅读 · 0 评论 -
迭代器的设计原则和Iterator Traits的作用与设计
一、迭代器设计原则迭代器是容器与算法处理的桥梁category分类,类别difference_type两个迭代器之间的距离的类型,容器最大能放多少元素,超过differene_type会有问题。迭代器的设计原则需要5中type,5种type叫做迭代器iterator associated types关联2.为什么设计iterator_traits算法向迭代器提问,迭代器...原创 2019-08-25 21:12:39 · 270 阅读 · 0 评论 -
weak_ptr概述,weak_ptr常用操作、尺寸
一、weak_ptr概述:weak_ptr辅助shared_ptr进行工作weak“弱",反义词”强“强值得就是shared_ptr,弱指的就是weak_ptr;weak_ptr:也是类模板,也是个智能指针。这个智能指针指向一个由shared_ptr管理的对象,但是weak_ptr不控制指向对象的生存期。换句话来说,将weak_ptr绑定到shared_ptr上并不会改变share...原创 2019-08-21 16:18:31 · 618 阅读 · 2 评论 -
谈谈const
一、const member functions(const成员函数)例子:const String str("hello world"); str.print(); 如果当初设计String::print()时未指明const,那么上行便是经由const object调用non-const member function,会出错。此非吾人所...原创 2019-08-17 09:29:25 · 139 阅读 · 0 评论 -
类型转换static_cast,dynamic_cast,const_cast,reinterpret_cast等
一、隐式类型转换系统自动进行,不需要程序开发人员介入。int m = 3 +45.6; //把小数部分截掉,也属于隐式类型转换的一种行为。doublen =3 +45.6;二、显示类型转换(强制类型转换)int k = 5 % 3.2; // 语法错int k = 5 %(int)3.2; // OK,C语言风格的强制类型转换int k = 5 % int(3.2);...原创 2019-08-17 13:31:53 · 502 阅读 · 0 评论 -
RTTI、dynamic_cast、typeid、虚函数表
一、RTTIRTTI(Run-Time Type Identification),通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。Human* phuman = new Man;Human &a = *phuman; // *phuman表示指针phuman所指向的对象RTTI我们可以把这个程序看成是一种系统提供给我们的一种能...原创 2019-08-18 14:35:58 · 393 阅读 · 0 评论 -
简单的自定义内存分配器
#include #include #include #include #include #include using namespace std;namespace liuqi {templateinline T* _allocate(ptrdiff_t size, T*) { set_new_handler(0); T* tmp = (T*)(::operator原创 2017-06-11 14:17:16 · 1013 阅读 · 0 评论 -
排序
1.sort对于被排序的元素,需提供operator// sort algorithm example#include // std::cout#include // std::sort#include // std::vectorbool myfunction (int i,int j) { return (i<j); }struct myc原创 2017-06-10 23:18:22 · 366 阅读 · 0 评论 -
继承(五)
1.类/对象大小计算 (1)结构体对齐原则 (2)与数据成员有关,与成员函数无关 (3)与静态数据成员无关 (4)虚继承对类的大小的影响 (5)虚函数对类的大小的影响2.虚基类表 (1)virtual base table [1]本类地址与虚基类表指针地址的差 [2]虚原创 2017-05-25 23:24:49 · 222 阅读 · 0 评论 -
继承(四)
1.多重继承 (1)单一继承--一个派生类最多只能有一个基类 (2)多重继承----一个派生类可以有多个基类 [1]class 类名 : 继承方式 基类1, 继承方式 基类2,... { }; [2]派生类同时继承多个基类的成员,更好的软件重用 [3]可能会有大量的二义性,多个基类中可能包含同名变量或函数 (3原创 2017-05-25 19:46:34 · 292 阅读 · 0 评论 -
继承(三)
1.转化与继承 派生类对象也是基类对象。这意味着在使用基类的地方可以派生类来替换。2.派生类到基类的转换 (1) 当派生类以public方式继承基类时,编译器可自动执行的转换(向上转行upcasting安全转换) [1]派生类对象指针自动转化为基类对象指针 [2]派生类对象引用自动转化为基类对象引用原创 2017-05-25 17:26:39 · 276 阅读 · 0 评论 -
CMyString
#include#includeusing namespace std;class CMyString{ private: char *m_pStr; friend ostream &operator friend CMyString operator +(const char *src,const CMyString &obj); frien原创 2014-10-22 21:35:06 · 553 阅读 · 0 评论 -
继承(二)
1.不能继承的成员函数 (1)构造函数 (2)析构函数 (3)=运算符2.继承与构造函数 (1)基类的构造函数不被继承,派生类需要声明自己的构造函数。 (2)声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化(调用基类构造函数完成)。 (3)派生类的构造函数需要给基类的构造函数传递参数。 (4)派生类对象的构造次原创 2017-05-25 13:08:44 · 281 阅读 · 0 评论 -
继承(一)
1.代码重用 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码,修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的类来创建新类,而不是重新创建它们。2.继承 (1)继承是使用已经编号的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。 (2)新类成为派生类或子类,原有类称为基类或父类。原创 2017-05-24 23:24:07 · 324 阅读 · 0 评论 -
模板(四)
#ifndef __INCLUDE_SINGLETON_H__#define __INCLUDE_SINGLETON_H__#include #include #include using namespace std;templateclass Singleton{ public: static T & GetInstance() {原创 2016-05-11 16:49:43 · 347 阅读 · 0 评论 -
单例模板模式控制台管理机制
#pragma once#ifndef __CONTROL__H#define __CONTROL__H#includetemplateclass CControl{protected: CControl(); ~CControl(); CControl(const CControl &control); CControl & operator = (const CCon原创 2015-10-13 21:40:06 · 533 阅读 · 0 评论 -
C++动态创建对象
1.类似java中的反射2.动态获取类型信息(方法与属性)3.动态创建对象 动态调用对象的方法 动态操作对象的属性 需要给每个类添加原数据 对原有的类不做任何改,只需要增加一个宏就能够动态创建4.动态创建对象 1)避免if,else编写,增加扩展性 2)将类名放到配置文件中,组件初步 组件A,主程序组件A; 后来出现组件B,主程序下载组原创 2017-05-24 14:22:37 · 917 阅读 · 0 评论