![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
li_unit
这个作者很懒,什么都没留下…
展开
-
c++模板元
模版元主要解决递归加速,单纯的递归会反复调用,函数等待,返回,所需时间多。模版元编译的时候慢,代码会增加,把运行时间节约在编译时template<int N>struct data{ enum{res=data<N-1>::res + data<N-2>::res};};template<>struct data<...原创 2020-01-18 00:14:20 · 102 阅读 · 0 评论 -
c++命名空间
命名空间:主要解决全局变量的冲突,内部不允许私有变量,所有变量都是公有的。namespace data{int x = 10;}data::x ::为域作用符,直接使用等同于使用全局变量,不存在就是0,不包含匿名命名空间内变量同一个文件引用static,当前文件static > 跨文件的externextern:引用外部全局变量static:特点...原创 2019-10-20 21:12:42 · 225 阅读 · 0 评论 -
c++特殊工具与技术
类型识别typeid:用于返回表达式的类型dynamic_cast:用于将基类的指针或引用安全的转换成派生类的指针或引用Base &b1,*b2;//Base是基类 Derived是派生类Derived &d = dynamic_cast<Derived&>(b1);Derived *d = dynamic_cast<Derived*&...原创 2019-10-20 21:05:42 · 145 阅读 · 0 评论 -
c++多重继承和虚继承
多重继承多重继承是指从多个直接基类中产生派生类的能力。多重继承的派生类继承了所有父类的属性。struct Base1 {Base1() = default;Base1(const string&);Base1(shared_ptr<int>);};struct Base2 {Base2() = default;Base2(const st...原创 2019-10-20 21:04:09 · 179 阅读 · 0 评论 -
c++随机数
随机数随机数库组成引擎:生成随机数unsigned整数序列分布:使用引擎返回服从特定概率分布的随机数default_random_engine e;//生成随机无符号数for (size_t i = 0; i < 10; ++i){//e()用来生成随机数cout << e() << endl;}Engine e:默...原创 2019-10-20 21:03:07 · 551 阅读 · 0 评论 -
c++正则表达式
正则表达式是一种描述字符序列的方法,就是寻找一定规则的匹配字符序列。在头文件regex中regex:表示有一个正则表达式的类regex_match:将一个字符序列与一个正则表达式匹配regex_search:寻找第一个与正则表达式匹配的子序列regex_replace:使用给定格式替换一个正则表达式sregex_iterator:迭代器适配器,调用regex_search来...原创 2019-10-20 21:02:00 · 233 阅读 · 0 评论 -
c++运算符重载
重载重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符共同组成。当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数数量比运算对象的数量少一个。重载时使用与内置类型一致的含义。注意&、*和const的使用输入输出运算符:&opetator>>、 &opetator &...原创 2019-08-25 20:49:25 · 171 阅读 · 0 评论 -
c++重载类型转换运算符
类型转换运算符类型转换运算符是类的一种特殊成员函数,负责将一个类类型的值转换成其他类型一个类型转换函数必须是类的成员函数,不能有返回类型,形参列表也必须为空,通常是const的。operator type() const;classSmallInt{public:SmallInt(inti = 0) :val(i) {}//转换源,为int型。可将算术类型转换...原创 2019-08-25 20:51:06 · 565 阅读 · 0 评论 -
c++重载函数调用运算符
函数调用运算符如果类重载了函数调用运算符则我们可以像使用函数一样使用该类的对象。函数调用运算符必须是成员函数。一个类可以定义多个不同版本的调用运算符。struct absint {int operator()(int val){return val < 0 ? -val : val;}};int x = -7;absint absobj;//含有函数调...原创 2019-08-25 20:52:42 · 1018 阅读 · 0 评论 -
c++函数模板
//函数模板//模板定义以关键字template开始,后跟模板参数列表template<typename T>int compare(const T& v1, const T& v2){return v1 < v2 ? -1 : 1;}//模板类型参数//可以用来指定返回类型或函数的参数类型,以及在函数体内用于变量声明或类型装换...原创 2019-09-08 18:31:05 · 101 阅读 · 0 评论 -
c++对象移动
右值引用一般的右值引用指向将要被销毁的对象,比如返回非静态数据的函数返回值,右值引用就是必须绑定到右值得引用,只能绑定到一个将要销毁的对象一般而言,一个左值表达式表示的是一个对象的身份,而右值表达式表示的是对象的值不能将左值引用绑定到要求转换的表达式、字面常量或返回右值的表达式,int i = 7;int& r = i;int&& rr = i;...原创 2019-08-25 20:46:24 · 705 阅读 · 0 评论 -
c++动态数组
动态数组是动态创建的数组,使用new和delete。new和数组分配一个数组会得到一个元素类型的指针初始化动态分配对象的数组,int *p = new int[3]{1,2,3};动态分配一个空数组是合法的释放动态数组, delete [] pa;智能指针和动态数组unique_ptr<int[]> up (new int[10]);shar...原创 2019-08-10 18:04:06 · 630 阅读 · 0 评论 -
c++智能指针
智能指针:智能指针也是模版,在头文件<memory>中shared_ptr:允许多个指针指向同一个对象。shared_ptr<string> p; 可以指向string类型的智能指针。会自动销毁所管理的对象,还会自动释放相关联的内存。unique_ptr:独占所指向的对象。weak_ptr:是一种弱引用,指向shared_ptr所管理的对象。*/sha...原创 2019-08-10 18:03:09 · 111 阅读 · 0 评论 -
c++关联容器之无序容器
无序容器在存储上组织为一组桶,每个桶保存零个或多个元素。无序容器使用一个哈希函数将元素映射到桶。unordered_map:用哈希数组织的mapunordered_set:用哈希数组织的setunordered_multimap:用哈希数组织的map,关键字可以重复unordered_multiset:用哈希数组织的set,关键字可以重复*/无需容器不是使用比较运算符...原创 2019-08-10 18:01:55 · 441 阅读 · 0 评论 -
c++关联容器之有序关联容器
关联容器是使用关键字来保存和访问元素的。有序关联容器是按顺序存储元素的集合。map:关联数组,保存 关键字--值 对set:关键值就是值,即只保存关键字的容器multimap:关键字可以重复出现的mapmultiset:关键字可以重复出现的setcout << "================map==============" << end...原创 2019-08-10 17:58:53 · 465 阅读 · 0 评论 -
c++泛型算法扩展和迭代器、反向迭代器
cout << "=====================插入迭代器================" << endl;back_inserter:创建一个使用push_back的迭代器front_inserter:创建一个使用push_front的迭代器inserter:创建一个使用insert的迭代器,第二个参数必须是指向给定容器的迭代器vector&...原创 2019-08-05 00:05:13 · 141 阅读 · 0 评论 -
c++泛型算法的定制操作和lambda表达式
cout << "=================lambda================" << endl;lambda:一个lambda表达式表示一个可调用的代码单元。可以理解为内联函数auto fun = [](auto num) {cout << num << endl; };fun(7);auto fun1 = ...原创 2019-08-05 00:05:20 · 164 阅读 · 0 评论 -
c++拷贝控制
//拷贝控制有很多的容器或模板出现下面的应用class Cla{}Cla ca;Cla cb;ca(cb);Cla cc = cb;这两种应用就是使用了拷贝构造函数和拷贝赋值运算符。拷贝构造函数是创建一个用来拷贝和自身一样类型的构造函数。拷贝赋值运算符是使用运算符重载的功能,将=号重载成可以拷贝自身类型的函数。//拷贝构造函数//拷贝构造函数是将传...原创 2019-08-17 23:45:21 · 138 阅读 · 0 评论 -
c++ oop面向对象
定义基类//基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。//基类必须将它的两种成员函数区分开来,//一种是基类希望其派生类进行覆盖的函数,既虚函数,使用virtual关键字//一种是基类希望派生类直接继承而不要改变的函数class Quote{public:Quote() = default;Quote(const string&am...原创 2019-08-31 13:13:15 · 121 阅读 · 0 评论 -
c++ opp虚函数和抽象基类
class Base {public:Base() = default;Base(int x):num(x){}~Base() = default;virtual int getNum(){return num;}private:int num;};class Derive : public Base{public:Derive() = ...原创 2019-08-31 13:15:40 · 181 阅读 · 0 评论 -
c++tuple和bitset
tupletuple是类似pair的模板,一个tuple可以有任意数量的成员,类型也可以不相同make_tuple:返回一个用给定初始值初始化的tuple,返回的tuple类型从初始值推断可以使用()、{}初始化但不能使用={}tuple<size_t, size_t, size_t> three;//tuple<int, string, vector<...原创 2019-09-22 22:02:02 · 114 阅读 · 0 评论 -
c++模板的重载与特例化
//重载与模板//函数模板可以被另一个或普通非模版函数重载,名字相同的函数必须具有不同数量或类型的参数template<typenameT> stringdebug_rep(constT&){/**/}template<typenameT> stringdebug_rep(T*p){/**/}stringdebug_rep(co...原创 2019-09-15 19:04:04 · 378 阅读 · 0 评论 -
c++可变参数模板函数
可变参数模版函数类型一致可变参数 “...” 使用头文件(cstdarg,va_list arg_ptr//开头指针va_start(arg_ptr, n)//从开头开始读取n个va_arg(arg_ptr,T)//根据数据类型取出数据va_end(arg_ptr)//结束读取template<typenameT>TaddSum(intn, Tt...原创 2019-09-15 19:02:43 · 313 阅读 · 0 评论 -
c++模板实参推断
//模板实参推断//类型转换与模板类型参数template<typenameT> Tfobj(T, T);//实参被拷贝template<typenameT> Tfref(constT&, constT&);//引用strings1("aaaaa");conststrings2("bbbbb");fobj(s1, s...原创 2019-09-15 19:01:09 · 660 阅读 · 0 评论 -
c++模板的成员模板
//成员模板//成员模板:一个类(无论是普通类还是模板类)可以包含本身是模板的成员函数。//成员模板不能是虚函数//普通类的成员模板class DebugDelete {public:DebugDelete(std::ostream &s = std::cerr) :os(s) {}//与任何函数模板相同,T的类型由编译器推断template<t...原创 2019-09-15 19:00:12 · 383 阅读 · 0 评论 -
c++模板的模板参数
//模板参数和作用域//模板参数遵循普通的作用域规则,模板参数会隐藏外层作用域声明的相同名字,//但是在模板内不能重用模板参数名。typedefdoubleA;template<typenameA, typenameB>voidf(Aa, Ba){Atem = a;//tmp的类型为模板参数A的类型,而非doubledoubleB;//...原创 2019-09-15 18:58:03 · 2047 阅读 · 0 评论 -
c++类模板与友元
//友元//前置声明,在Blob中声明友元所需要的。为了引用模板的一个特定实例,必须首先声明模板自身。template<typename> class BlobPtr;template<typename> class Blob;template<typename T>class Blob {public://友元fri...原创 2019-09-08 18:33:12 · 249 阅读 · 0 评论 -
c++类模板
//类模板//与函数模板不同之处是,编译器不能为类模板推断模板参数类型//一个类模板的每个实例都形成一个独立的类。//默认情况下一个实例化的类模板,其成员只有在使用时才被实例化template<typename T>class Blob {public:typedef T value_type;typedef typename std::vector&l...原创 2019-09-08 18:31:55 · 135 阅读 · 0 评论 -
c++ oop构造函数与拷贝控制
class Quote {public:Quote(int x) :x(x) {}//如果我们删除的是一个指向派生类对象的基类指针,则需要虚析构函数virtual ~Quote() = default;//动态绑定析构函数int x;virtual void show(){cout << x << endl;}};class Bu...原创 2019-08-31 13:18:58 · 145 阅读 · 0 评论 -
c++ oop访问控制与继承
class Base{public:Base() = default;~Base(){}friend class Pal;//pal在访问Base的派生类时不具有特殊性int size()const { return count; }protected:int num;private:int count;};受保护成员protected受保护成员...原创 2019-08-31 13:17:25 · 82 阅读 · 0 评论 -
c++泛型算法使用及分类
//泛型算法本身不会执行容器的操作,它们只会运行于迭代器之上,执行迭代器的操作//算法永远不会改变底层容器的大小。cout << "==================只读算法================" << endl;vector<int> vec{ 9,8,7,6,5,4,3,2,1,0 };auto ip = find(vec.be...原创 2019-08-05 00:05:26 · 346 阅读 · 0 评论 -
c++容器适配器栈和队列
//stack:栈//queue:队列//priority_queue:有优先级的队列,优先级高的在前//size_type:一种类型,足以保存当前类型的最大对象的大小//value_type:元素类型//container_type:实现适配器的底层容器类型cout << "===================stack================...原创 2019-08-05 00:05:36 · 172 阅读 · 1 评论 -
c++自定义类型和预处理
struct,内部初始化变量时,不能用()。struct data {int x = 12;float f = 122.5f;int *pi = &x;};data da;cout << da.f << endl;data *dap = new data;//使用*的话需要初始化cout << dap->f...原创 2019-08-03 19:01:29 · 220 阅读 · 0 评论 -
c++处理类型
//类型别名typedef:typedef int ity;ity x(12);typedef int* pity;pity ip(&x);cout << *ip << endl;//usingusing ud = double;ud dval(3.1415);using upd = double*;upd pd(&...原创 2019-08-03 18:52:21 · 144 阅读 · 0 评论 -
c++常量和常量表达式
const,默认情况下仅在文件内有效const int i(12);const引用:对常量的引用不能被用作修改它所绑定的对象const int ci(5);const int &rci(ci);rci = 90;//错误 不能修改允许常量引用绑定到非常量的对象、字面值或表达式上int i = 20;const int &ri(20);con...原创 2019-08-03 18:49:31 · 4410 阅读 · 0 评论 -
c++引用和指针
引用:给对象起另一个名字,引用必须初始化一般在初始化的时候,初始值会被拷贝到新建的对象中,定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用,绑定后无法令引用再绑定到另一个对象,因此必须初始化。int x = 12;int y = 23;int &rx(x);rx = y;//为赋值不是绑定,rx还是代表xcout << rx <...原创 2019-08-03 18:46:36 · 246 阅读 · 0 评论 -
c++类型转换
//类型转换隐式转换:类型自动转换,无须操作隐式转换发生的一些情况1.比int类型小的整型值首先提升为较大的整数类型2.在条件中,非布尔值转换成布尔值3.初始化时,赋值时4.运算对象有多种类型时5.函数调用或返回时算术转换:运算符的运算对象将转换成最宽的类型整型提升:转换后的类型要能容纳原类型所有可能的值。无符号类型转换:先整型提升,如果结...原创 2019-08-03 18:44:39 · 232 阅读 · 0 评论 -
c++基本类型和变量
//基本类型,c++内置类型setlocale(LC_ALL, "chs");bool bo(true);char ch('a');wchar_t *wch ( L"中国");short sh(32767);//-32768~32767int i(10);//-32768~32767long l(123456);//-2147483648~2147483647lon...原创 2019-08-03 18:42:07 · 303 阅读 · 0 评论 -
单链表的链表拆分
1.定义三的指针变量*p、*q、*t,p指向原链表的头结点head1,新建另一个头结点head2,q指向head2,t指向head1的next结点,两个头结点的next都设为空。2.按照条件分配t指向的结点,如果将这个结点连接到head1的链表中,(1)让p的next指向t(2)p和t都向后移,既p指向p的next,t指向t的next。(3)再让p的next为空。//链表拆分#inclu原创 2016-08-05 15:36:29 · 3290 阅读 · 0 评论 -
单链表删除重复链表
1.定义三个指针变量*p,*q,*t,p先指向第一个要扫描的结点.2.判断链表中是否存在和p一样的结点,让q指向p,判断q的next结点是否和p相同,如果相同(1)让t指向这个结点.(2)让q的next指向t的next.(3)销毁t所指向的结点3.如果q的next结点不于p结点相同,则让q向后移动,既q=q->next;4.判断完当前p结点后,让p结点后移。#include #i原创 2016-08-05 16:07:24 · 257 阅读 · 0 评论