![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 71
csdn_chai
这个作者很懒,什么都没留下…
展开
-
【STL】容器 > 顺序容器 > list(双向链表)
STL中的list就是一双向链表,可高效地进行插入删除元素。STL提供的list是一个双向链表容器,对应的迭代器类型为Bidirectional Iterators. 对于双向链表我们可以方便的在任意位置进行插入和删除操作,list每个节点的内存位置之间没有必然联系。List 是C++标准程式库中的一个类,可以简单视之为双向连结串行,以线性列的方式管理物件集合。list 的特色是在集合的任何位置增原创 2017-08-26 13:24:39 · 498 阅读 · 0 评论 -
C++ 11 复习要点
C++11原创 2017-08-31 19:45:28 · 534 阅读 · 0 评论 -
【C++复习】易错的小问题
1. 数组初始化数组初始化有很多坑,比如int a [10]; 这样的话,10个元素的值都是没有初始化的,在32位Windows上是-858993460,16进制表示是0xcccccccc,栈中变量如果没有初始化,值就是这个。如果要初始化数组,可以用int a[10] = {}; 或者int a[10] = {0};两种都是把值初始化为0。需要注意的是,这种方法只能把值原创 2017-08-30 09:36:39 · 1418 阅读 · 1 评论 -
【剑指offer】剑指offer 练习笔记
剑指offer练习1. 赋值运算符class CMyString{char* m_pData; int size; }写一个CMyString类的赋值运算符。CMyString& operator = (const CMyString& s){if( this == &s) return * this; if(m_pData) delete[]原创 2017-08-30 16:41:25 · 433 阅读 · 0 评论 -
【STL】unodered_map
unordered_map的定义template class Key,class T,class Hash = hashKey>,class Pred = equal_toKey>,class Alloc = allocatorconst Key,T> >> class unordered_map;12345模版参数说明:Key 主键的类型。 在类模板内部,原创 2017-09-25 13:10:03 · 1515 阅读 · 0 评论 -
STL 复习要点
1.说说std::vector的底层(存储)机制。vector就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时,会自动申请另一片更大的空间(一般是增加当前容量的50%或100%),然后把原来的数据拷贝过去,接着释放原来的那片空间;当释放或者删除里面的数据时,其存储空间不释放,仅仅是清空了里面的数据。2.std::vector的自增长机制。当已经分配的空间原创 2017-08-26 11:32:15 · 1872 阅读 · 0 评论 -
静态链接库LIB和动态链接库DLL的区别
静态链接库LIB和动态链接库DLL的区别一、 静态链接库与动态链接库区别静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态转载 2017-09-17 07:20:30 · 338 阅读 · 0 评论 -
【STL】queue队列适配器
queue和stack一样,也是STL中的适配器。任何支持push_back(), pop_front()的容器都可以支持,即deque双端队列, list双向链表。默认是deque.基本操作:push 入队pop 出队sizeemptyfront 获得队首元素值back 获得对尾元素值原创 2017-08-28 23:00:57 · 365 阅读 · 0 评论 -
【STL】容器 > 顺序容器 > deque(双端队列)
deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。一、内部实现deque是双端队列可在头和尾部插入、删除元素。deque动态地以分段原创 2017-08-26 13:13:36 · 441 阅读 · 0 评论 -
C++ 复习要点
本文总结一下C++面试时常遇到的问题。原创 2017-09-20 15:03:13 · 22940 阅读 · 9 评论 -
new operator、operator new 、placement new三者之间的区别与联系
new operator、operator new 、placement new三者之间的区别与联系1. new的执行过程:(1)通过operator new申请内存(2)使用placement new调用构造函数(简单类型忽略此步)(3)返回内存指针 2. new和malloc的比较:(1)new失败时会调用new_handler处理函数,malloc不会,失原创 2017-09-09 05:23:40 · 494 阅读 · 0 评论 -
C++ 对象模型
注意虚指针在所有成员的前面。原创 2017-09-03 16:17:44 · 287 阅读 · 0 评论 -
轻松搞定面试中的红黑树问题
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/silangquan/article/details/18655795 连续两次面试都问到了红黑树,关键两次都没有答好,这次就完整地来学习整理一下。没有学习过红黑树的同学请参考:> Chapter 13 Red-Black Trees Chapter 14 Augmenting转载 2017-09-19 16:31:32 · 968 阅读 · 0 评论 -
C++ 字节对齐(class 与struct)
大家都知道,C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址。非空类的大小与类中非静态成员变量和虚函数表的多少有关。而值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有关。成员变量在类中的内存存储并不一定是连续的。它是按照编译器的设置,按照内存块来存储的,这个内存块大小的取值,就是内存对齐。转载 2017-08-24 20:20:21 · 1170 阅读 · 0 评论 -
C++ 变长参数
一个典型的过程是int sum(char *msg, ...){ va_list st; va_start(st, msg); int total = 0; int tmp; while((tmp = va_arg(st, int)) != 0) { total += tmp; } va_en原创 2017-09-01 14:10:55 · 429 阅读 · 0 评论 -
C++ 左值和右值,左值引用和右值引用
区分左值右值的真正说法是:能否用“取地址&”运算符获得对象的内存地址。临时对象是右值,可以被右值引用或者常量左值引用来引用;持久对象是左值,可以被左值引用或常量左值引用来引用;对于临时对象,它可以存储于寄存器中,所以是没办法用“取地址&”运算符;对于常量,它可能被编码到机器指令的“立即数”中,所以是没办法用“取地址&”运算符;字符串字面值常量是C++标准中明确指明的特例,为原创 2017-09-01 13:46:27 · 635 阅读 · 0 评论 -
C++ 析构函数执行顺序
通过 Student 类依次创建了3个对象,分别是 stu1、stu2、stu3,但它们对应的析构函数的执行顺序却是相反的,这是为什么呢?要搞清楚这个问题,首先要明白C++内存模型,也就是C++的代码和数据在内存中是如何存储的。在内存模型中有一块区域叫做栈区,它是由系统维护的(程序员无法操作),用来存储函数的参数、局部变量等,类似于数据结构中的栈,也是先进后出。当遇到函数调转载 2017-09-01 09:50:42 · 5644 阅读 · 1 评论 -
C++ 函数返回引用的问题
先看看该链接讨论的问题作为热身。http://topic.csdn.net/u/20070616/13/2a6a1739-1a69-4829-a90f-fdb19a61e095.html 函数返回值和返回引用是不同的函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几转载 2017-09-01 09:01:26 · 1099 阅读 · 1 评论 -
memset(this, 0, sizeof *this)
有时候类里面定义了很多int,char,struct等c语言里的那些类型的变量,我习惯在构造函数中将它们初始化为0,但是一句句的写太麻烦,所以直接就memset(this, 0, sizeof *this);将整个对象的内存全部置为0。对于这种情形可以很好的工作,但是下面几种情形是不可以这么使用的:1.类含有虚函数表:这么做会破坏虚函数表,后续对虚函数的调用都将出现异常2.类中含有转载 2017-09-09 05:54:04 · 2886 阅读 · 0 评论 -
【STL】C++11新特性emplace操作
emplace操作是C++11新特性,新引入的的三个成员emlace_front、empace 和 emplace_back,这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。两者的区别 当调用insert时,我们将元素类型的对象传递给insert,元素的对象被拷贝到容转载 2017-08-28 22:59:05 · 4909 阅读 · 0 评论 -
【STL】栈适配器stack
STL中的栈stack是一个适配器,它的实现容器可以是deque, vector, 或者list, 默认是deque,只要支持push_back()和pop_back()的容器就可以。构造函数 stack> ;stack> sk; stack> sk; stack sk; stack> sk; STL 中stack的基本操作很少:empty() 判空top()原创 2017-08-29 13:41:09 · 301 阅读 · 0 评论 -
【STL】STL之顺序容器和关联容器总结
顺序容器 Vector中所采用的数据结构非常简单:线性连续空间。当分配空间被占满而仍然需要添加元素时,vector便会进行一场空间重新配置的大工程!在这里,程序员需要注意的是,一旦引起空间重新配置,之前指向原vector的所有迭代器就都失效了,这一点在工程中容易引起bug。 List则对空间的运用有绝对的精准,一点也不浪费。注意,list内部构成的实际是一个转载 2017-08-26 14:59:55 · 2538 阅读 · 2 评论 -
【STL】容器 > 顺序容器 > vector
vector 是一种动态数组一、内部实现1.1 底层存储机制vector是一块连续内存,当空间不足了会再分配。 vector就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时,会自动申请另一片更大的空间(一般是增加当前容量的50%或100%),然后把原来的数据拷贝过去,接着释放原来的那片空间;当释放或者删除里面的数据时,其存储空间不释放,仅仅是清空了里面的数据原创 2017-08-26 11:18:15 · 288 阅读 · 0 评论 -
【STL】STL 一般总结
在C++标准中,STL被组织为下面的17个头文件:algorithm>、deque>、functional>、iterator>、array>、vector>、list>、、、、、numeric>、queue>、set>、、stack>utility>。转载 2017-08-26 10:09:45 · 190 阅读 · 0 评论 -
【STL】容器 > 顺序容器 > string 容器
string 是最常用的STL容器。内部实现C++程序员编码过程中经常会使用string(wstring)类,你是否思考过它的内部实现细节。比如这个类的迭代器是如何实现的?对象占多少字节的内存空间?内部有没有虚函数?内存是如何分配的?构造和析构的成本有多大?笔者综合这两天阅读的源代码及个人理解简要介绍之,错误的地方望读者指出。首先看看string和wstring类的定义:转载 2017-08-26 08:15:36 · 375 阅读 · 0 评论 -
sizeof 关键字总结
C++ sizeof 关键字是比较重要的以函数显示定义的关键字。返回值是size_t。转载 2017-08-24 15:47:14 · 432 阅读 · 0 评论 -
C++ const
const 是左结合的,若左边为空,则再向右结合 一、指向 const 对象的指针指向 const 对象的指针,指的是指针指向的对象的内容是const的,不可修改,但指针本身(即指针的值)是可以修改的。例1:char acConst[] = "const";const char *pcConst = acConst; *pcConst = ‘C’;转载 2017-09-04 09:39:47 · 317 阅读 · 0 评论 -
【STL】迭代器iterator和有关问题
迭代器的基本操作(即每种容器的迭代器都有的操作): 自增++ 自减-- 去引用*原创 2017-08-28 22:39:15 · 292 阅读 · 0 评论 -
【STL】反向迭代器
C++ primer (中文版第四版)第273页9.3.2 begin和end成员 begin和end操作产生指向容器内第一个元素和最后一个元素的下一个位置的迭代器,如下所示。这两个迭代器通常用于标记包含容器中所有元素的迭代范围。c.begin() 返回一个迭代器,它指向容器c的第一个元素c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置c.r转载 2017-08-28 22:20:05 · 313 阅读 · 0 评论 -
指针和引用的区别
★ 相同点: 1. 都是地址的概念; 指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。 ★ 区别: 1. 指针是一个实体,而引用仅是个别名; 2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 引用“从一而终” ^_^ 4. 引用没有 con转载 2017-08-23 17:19:59 · 221 阅读 · 0 评论 -
排序算法的稳定性
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相转载 2017-08-28 09:48:59 · 299 阅读 · 0 评论 -
【STL】容器 > 关联式容器 > map
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。一、内部实现map的底层是一棵红黑树,在对节点的插入或是删除操作中,通过旋转来保持平衡性,最坏情况下的插入、删除、查找时间是O(logn),效率非常之高。1.1 红黑树1.1.1 特点参考:http://blog.原创 2017-08-27 06:24:45 · 246 阅读 · 0 评论 -
【STL】容器 > 关联式容器 > set(集合)
一、内部实现C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用原创 2017-08-27 10:26:53 · 282 阅读 · 0 评论 -
【STL】智能指针auto_ptr
C++中指针申请和释放内存通常采用的方式是new和delete。然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存。下面简单说一下用法。[cpp] view plain copy用法一: std::auto_ptrm_example(new MyClass()); 用法二: std::auto_ptrm_exampl转载 2017-08-27 15:00:38 · 270 阅读 · 0 评论 -
C++ sizeof
转自:http://krystism.is-programmer.com/ 学过c的都知道sizeof运算符。不过还是需要注意以下几点。先从c的sizeof说起:1. sizeof 是运算符,而不是函数。虽然我们习惯sizeof(...),但( )并不是必需的,它只是表示优先级。我们把sizeof后面的目标叫对象或者操作数。本文约定就叫sizeof对象。2. 当si转载 2017-09-05 12:06:47 · 291 阅读 · 0 评论 -
面向对象五大原则和三个基本特征
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。 Liskov替换原原创 2017-08-22 08:57:58 · 279 阅读 · 0 评论