- 博客(58)
- 收藏
- 关注
原创 C++11-从Rvalue references(右值引用)到move的设计
(1)当copy的右手边来源端是右值,那么左值可以“偷”右手边resource而不需要执行allocation;(2)左值和右值的差别:1、左值是变量;2、不能放在左手边的就是右值;(3)string是一个指针,对于string的红色测试都通过编译了,表达式s1+s2,临时对象string()都通过了!!!(4)对于complex的测试也通过了测试!!!complex没有指针哦!
2022-09-19 21:06:50 440
原创 c++11新特性--variadic templates(详细)
可以应用这个技巧,改变参数个数逐一减少,实现递归1)template模板代表的有函数模板和成员模板;variadic是参数,参数数量和参数类型;(2)新的关键字就是…,template;注意…在三个不同位置;
2022-09-19 10:49:45 553
原创 C++11—lambda表达式
]{}是一个类型;[]{}()就可以调用,相当于临时对象;多数会写成最后一种形式,赋予一个名称auto I=[]{};I();
2022-09-15 17:39:12 306
原创 C++11-decltype
相当于typeof,**可以获取表达式的类型;但是typeof并不是标准库的,所以C++11添加了新的关键字decltype;就像decltype(coll)::value_type elem;
2022-09-15 16:24:15 356
原创 type alias+noexcept+override+final
(1)typedef void(func)(int,int)说明func是一个函数指针,与下面的using func=void()(int,int)等价,但是using更加的明显,凸显func是一个类型;(2)右侧也是等效,using value_type=T等价于typedef T value_type;
2022-09-01 15:55:17 140
原创 c++11 explicit range
关键字explicit用于构造函数,用于防止;只有在明确调用单参数构造函数时,才使用;左侧就会发生隐式转换;explicit:明确的。
2022-08-09 17:23:24 109
原创 C++11 Alias Template(template typedef)化名,Alias,换一个名称
2)右侧改善,传过去的是一个对象object,修改为list(),建立一个临时对象;(1)传入的是一个容器的对象object,需要在函数中取出容器的元素类型,函数第一行首先取出容器中的iterator迭代器,然后使用迭代器萃取机提问valuetype从而获得容器内的元素类型;(1)左侧版本天方夜谈因为传入的参数是一个容器(类型),但接收的是一个容器对象object,函数体中对容器类型进行区分,不太对。(3)不能对化名,来进行特化和偏特化,还是需要。,化名只是一个名字,不代表本尊;......
2022-07-29 18:04:21 346
原创 C++11=default,=delete
1)=default,默认,当你自行定义了一个构造函数,那么编译器就不会再给一个defaultctor,如果强制加上=default,就可以重新使用defaultctor;(2)主要作用在构造函数,拷贝构造,搬移构造,=delete就是不要它,=deafult是要编译器默认那个;(3)在库中的=delete使用情况,如下图,主要用于构造函数,拷贝构造,拷贝赋值和析构函数;多了与搬运构造和赋值;&&与move有关;(4)=default在库中的应用,在move和copy上,下图是析构函数。...
2022-07-29 17:12:38 883
原创 C++11改动
1)用nullptr代替0和NULL;空指针;(2)nullptr的类型是stdnullptr_t,定义在头文件cstddef中;
2022-07-28 15:50:31 149
原创 C++11新特性-Variadic Templates
使用时一定要写处理最后情况的函数(1)constType&…args表明接收任意数量任意类型的参数;(2)可以帮助我们做递归操作每次取出一个参数;做一个递归结束无参数的函数,终止递归;(3)sizeof…(args)返回到底有多少个;(4)2和3可以并存吗,是可以的!...
2022-07-27 18:29:20 307
原创 怎么限制一个类的对象实例,只能在“堆“上分配,或者只能在“栈“上分配
在C++中,类的对象建立分为两种,一种是静态建立(栈),如Aa;另一种是动态建立(堆),如A*ptr=newA;这两种方式是有区别的。一个类对象,是由编译器为对象在中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,。动态建立类对象,是使用n(或malloc)将对象建立在堆空间中。这个过程分为两步,第一步是执行operatornew()函数,在堆空间中搜索合适的内存并进行分配;第二步是调用构造函数构造对象,初始化这片内存空间。...
2022-07-25 22:46:56 965
原创 静态成员函数和普通成员函数的区别
类能够调用静态成员函数,对象也能够调用静态成员函数,但是由于静态成员函数并没有包含this指针,所以即使是用对象去调用静态成员函数,也是无法访问对象的成员变量。普通成员函数在创建时,会隐式增加一个this指针,对象在调用普通成员函数时,对象会把当前地址传给this指针,这就是为什么能在当前对象调用对象的成员变量。对象创建时,并不包括成员函数,其中在内存模型中所存储的一般为虚函数表指针,虚继承表指针,以及对应的成员变量。会在代码区创建相应代码块,但是值得一提的是,一旦创建第一个实例化对象,之后再创建对象,..
2022-07-25 22:27:37 1171
原创 STL源码解析—move对容器速度效能影响
set\map中sert也提供指定位置的版本,但这个位置仅作为一个提示,实际还是insert到应该的位置
2022-07-25 21:58:46 175
原创 STL源码解析-算法举例
count是一个全局函数,部分容器提供自己的成员函数count(set,map等关联型容器)关联型容器通过key可以找到一个value值。
2022-07-23 18:10:28 114
原创 STL源码解析-RB_tree
key_compare是一个仿函数,里面没有数据,实际大小为0,实际上,在编译器中,对于大小为0的数据,测量结果为1,那么,红黑树的数据大小为9,由于大小对其,则调整为12。
2022-07-20 18:36:55 105
原创 STL常用算法
算法概述算法主要是由头文件<algorithm> <functional> <numeric>组成。<algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…<numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数.<functional> 定义了一些模板类,用以声明函数对象。遍历算法for_eachfor_each基本用法://
2021-10-14 21:09:42 85
原创 STL函数对象、谓词、内建函数、适配器
函数对象(仿函数)重载函数调用操作符()的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。函数对象特点//函数对象是重载了函数调用符号的类class MyPrint{public: MyPrint() { m_Num = 0; }
2021-10-11 21:11:42 140
原创 STL常用容器—map
map/multimap基本概念Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操
2021-10-11 16:21:03 62
原创 STL常用容器—set/mutiset
基本概念set为关联式容器按照key值从小到大排序set容器基本概念Set的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator(只读迭代器).set拥有和list某些
2021-10-08 15:49:33 191
原创 STL常用容器—list
list基础链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list
2021-10-07 17:48:08 83
原创 STL常用容器-stack、queue
STL常用容器-stackstack基础stack容器APIstack构造函数stack赋值操作stack数据存取操作stack大小操作stack基础stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。有元素推入栈的操作称为:push,将元素推出stack的操作称为pop.stack没有
2021-10-07 16:06:17 221
原创 STL常用容器-deque
Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异一在于deque允许使用常数项时间对头端进行元素的插入和删除操作。二在于deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样,”旧空间不足而重新配置一
2021-09-27 16:17:02 68
原创 STL常用容器-vector
vector容器vector基本概念vector基本概念vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一
2021-09-23 21:19:37 68
原创 STL常用容器-string
string容器string 构造函数string基本赋值操作string存取字符操作string拼接操作string查找和替换string比较操作string子串string插入和删除操作string和c-style字符串转换String和c风格字符串对比:Char*是一个指针,String是一个类string 封装了 char*,管理这个字符串,是一个char*型的容器。String封装了很多实用的成员方法查找find,拷贝copy,删除delete 替换replace,插入insert不
2021-09-23 20:26:02 71
原创 STL标准模板库
STL简介STL基本概念STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)容器和算法通过迭代器进行无缝连接STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。STL优点STL 是 C++的一部分,因此不用额外安装什么
2021-09-23 18:56:10 77
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人