![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
CCCSR
这个作者很懒,什么都没留下…
展开
-
C++ 模板特例化
文章目录介绍函数模板特例化类模板特例化介绍模板作为C++泛型编程的基础十分重要,其使得一份代码能用于处理多种数据类型。而有些时候,我们会希望对一些特定的数据类型执行不同的代码,这时就需要使用模板特例化(template specialization)。函数模板特例化首先说一个重要的,函数模板的特例化并不是函数重载,每一个特例化实际上是提供了另一个模板定义式,因此特例化不影响函数匹配。特例化一个函数模板时,必须为模板中的每个参数都给出实参,关键字template后跟一个<>templa原创 2020-12-05 17:08:25 · 1986 阅读 · 0 评论 -
C++ 引用折叠和右值引用参数
假定有一个模板如下tempalte<typename T> void f(T&&);如果有一个i为一个int对象,那么我们可能认为类似f(i)这样的调用是不合法的,因为通常不能将右值引用绑定到一个左值上:int i = 0;f(i);//向一个右值引用形参传入一个左值实参,是否正确?事实上,C++在正常绑定规则外定义了两个例外规则允许这种绑定。这两个例外规则是move标准库设施正确工作的基础。第一个例外规则影响右值引用参数的推断如何进行:当将一个左值传递给函数原创 2020-11-23 19:35:32 · 380 阅读 · 0 评论 -
C++ final和override关键字
防止继承C++11提供了一种防止继承发生的方法:在类名后面跟一个关键字final。class NoDerived final { /* */};//编译错误:无法将final类类型作为基类class Derived :public NoDerived{ /* */};原创 2020-11-21 15:42:29 · 284 阅读 · 0 评论 -
C++ 动态绑定
定义动态绑定是在运行期间发生的绑定,发生动态绑定的函数的运行版本由传入的实际参数类型决定,在运行时觉得函数的版本,所以动态绑定又称运行时绑定,动态绑定是C++的多态实现的一种形式。在C++中,当使用基类的引用或指针调用一个虚函数时将发生动态绑定。实现原理C++中的动态绑定通过虚函数实现。而虚函数是通过一张虚函数表(virtualtable)实现的,拥有虚函数的类在实例化时会创建一张虚函数表。这个表中记录了虚函数的入口地址,当派生类对虚函数进行重写时,虚函数表中相关虚函数的地址就会被替换,以保证动态绑原创 2020-11-20 20:15:42 · 3078 阅读 · 0 评论 -
C++11 智能指针(三) unique_ptr
目录介绍创建一个unique_ptr转移所有权特殊情况介绍一个unique_ptr独占它所指向的对象。某个时刻只能有一个unique_ptr指向一个给定对象。unique_ptr被销毁时,它指向的对象也会被销毁。一个unique_ptr不支持普通的拷贝或赋值:unique_ptr<string> p1(new string{"abc"});unique_ptr<string> p2(p1);//错误:不支持拷贝unique_ptr<string> p3;//错误原创 2020-11-16 14:23:21 · 226 阅读 · 0 评论 -
C++11 智能指针(一) shared_ptr
目录前言shared_ptr介绍创建一个shared_ptrmake_shared函数shared_ptr的内存泄漏一个简单的shared_ptr实现前言C++中使用一对运算符new和delete来管理动态内存:new在动态内存中为对象分配空间并返回一个指向该对象的指针,delete接受一个动态对象的指针,销毁该对象并释放与之关联的内存。确保在正确的时间释放内存极其困难。有时我们会忘记释放已分配的内存,这种情况下就会产生内存泄漏;有时在尚有指针引用内存的情况下我们就释放了它,这种情况下就产生了一个引用原创 2020-11-13 15:43:46 · 359 阅读 · 0 评论 -
C++11 lambda表达式
目录介绍lambda优点lambda捕获值捕获引用捕获隐式捕获可变lambda介绍lambda一个lambda表达式表示一个可调用的代码单元。可以将其理解为一个未命名的内联函数。与任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与普通函数不同,lambda可能定义在函数内部。一个lambda表达式具有如下形式:[capture list] (parameter list) -> return type { function body }capture list(捕原创 2020-11-11 18:07:07 · 244 阅读 · 0 评论 -
vector扩容
扩容原理vector以连续的数组存放数据,当vector空间已满时会申请新的空间并将原容器中的内容拷贝到新空间中,并销毁原容器存储空间的重新分配会导致迭代器失效因为分配空间后需要进行拷贝,编译器会预分配更多空间以减少发生拷贝影响程序效率扩容的大小叫做扩容因子,扩容因子由编译器决定,VS的扩容因子为1.5,G++中,扩容因子为2 vector<int> v = { 1,2,3,4,5,6 }; cout << v.capacity()<<' '; v.pu原创 2020-11-10 18:48:14 · 1153 阅读 · 0 评论 -
处理顺序容器迭代器失效问题
编写改变容器的循环程序添加/删除vector、string或deque元素的循环程序必须考虑迭代器、引用和指针可能失效的问题。程序必须保证每个循环步中都更新迭代器、引用或指针。如果循环中调用的是insert或erase,那么更新迭代器很容易。这些函数都会返回一个有效的迭代器,使用其可以对迭代器进行更新。//删除偶数元素,复制奇数元素 vector<int> v = { 0,1,2,3,4,5,6,7,8,9 }; auto it = v.begin(); while (it != v.原创 2020-11-10 17:48:39 · 216 阅读 · 0 评论 -
顺序容器中的迭代器失效
容器操作可能使迭代器失效向容器中添加元素和从容器中删除元素的操作可能会使指向容器元素的指针、引用或迭代器失效。一个失效的指针、引用或迭代器不再表示任何元素。使用失效的指针、引用或迭代器是一种严重的程序设计错误,很可能引起与使用未初始化指针一样的问题。向容器添加元素后:如果容器是vector或string,且存储空间重新分配,则指向容器的迭代器、指针和引用都会失效。如果存储空间未重新分配,指向插入位置之前的元素的迭代器、指针和引用仍有效,但指向插入位置之后的元素的迭代器、指针和引用将会失效。 //原创 2020-11-10 17:00:43 · 233 阅读 · 0 评论