摘要:
# 20.STL中list与queue之间的区别 `std::list` 和 `std::queue` 是 C++ 标准库中的两个不同容器,它们之间有以下几点区别: 1. 容器类型:`std::list` 是一个双向链表,而 `std::queue` 是一个队列,可以使用多种实现方式(如顺序容器、优 阅读全文
摘要:
# 19.map中[]与find的区别? 1. map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关键码,就将一个具有该关键码和值类型的默认值的项插入这个map。 2. map的find函数:用关键码执行查找,找到了返回该位置的迭代器;如果不存在这个关键码,就 阅读全文
摘要:
# 18.vector越界访问下标,map越界访问下标?vector删除元素时会不会释放空间? ## 1.vector越界访问下标 `std::vector`是C++标准库中的一种动态数组,其大小可以根据需要进行调整。当你试图访问一个不存在的元素,即访问超出其当前大小范围的索引时,将会发生越界访问。 阅读全文
摘要:
# 17.STL中unordered_map(hash_map)和map的区别,hash_map如何解决冲突以及扩容 ## 1.区别 ### 1.1需要引入的头文件不同 map: `#include ` unordered_map: `#include ` ### 1.2内部实现机理不同 map: 阅读全文
摘要:
# 16.map插入方式有哪几种? 1.用insert函数插入pair数据 ```C++ mapStudent.insert(pair(1, "student_one")); ``` 2.用insert函数插入value_type数据 ```C++ mapStudent.insert(map::va 阅读全文
摘要:
# 15.如何在共享内存上使用STL标准库? 1.想像一下把STL容器,例如map, vector, list等等,放入共享内存中,IPC一旦有了这些强大的通用数据结构做辅助,无疑进程间通信的能力一下子强大了很多。 我们没必要再为共享内存设计其他额外的数据结构,另外,STL的高度可扩展性将为IPC所 阅读全文
摘要:
# 14.map、set是怎么实现的,红黑树是怎么能够同时实现这两种容器? 为什么使用红黑树? 1.他们的底层都是以红黑树的结构实现,因此插入删除等操作都在O(lgn)时间内完成,因此可以完成高效的插入删除; 2.在这里我们定义了一个模版参数,如果它是key那么它就是set,如果它是map,那么它就 阅读全文
摘要:
# 13.STL迭代器如何实现 1.迭代器是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器,除此之外,STL中迭代器一个最重要的作用就是作为容器与STL算法的粘合剂。 2.迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器内部必须保存一个与容器相关联的指针,然后重 阅读全文
摘要:
# 12.容器内部删除一个元素 ## 1.关联容器的删除 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除 阅读全文
摘要:
# 11.Vector如何释放空间? 由于vector的内存占用空间只增不减,比如你首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是内存占用仍为10000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以 阅读全文
摘要:
# 10.STL 中vector删除其中的元素,迭代器如何变化?为什么是两倍扩容?释放空间? size()函数返回的是已用空间大小,capacity()返回的是总空间大小,capacity()-size()则是剩余的可用空间大小。当size()和capacity()相等,说明vector目前的空间已 阅读全文
摘要:
# 9.vector与list的区别与应用?怎么找某vector或者list的倒数第二个元素 1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的 阅读全文
摘要:
# 8.STL的两级空间配置器 ## 为什么有适配器? (1)小块内存带来的内存碎片问题 单从分配的角度来看。由于频繁分配、释放小块内存容易在堆中造成外碎片(极端情况下就是堆中空闲的内存总量满足一个请求,但是这些空闲的块都不连续,导致任何一个单独的空闲的块都无法满足这个请求)。 (2)小块内存频繁申 阅读全文
摘要:
# 7.简单说一下traits技法 traits技法利用“内嵌型别“的编程技巧与**编译器的template参数推导功能**,增强C++未能提供的关于型别认证方面的能力。常用的有iterator_traits和type_traits。 **iterator_traits** 被称为**特性萃取机** 阅读全文
摘要:
6.STL中hashtable的实现? STL中的hashtable使用的是开链法解决hash冲突问题,如下图所示。 hashtable中的bucket所维护的list既不是list也不是slist,而是其自己定义的由hashtable_node数据结构组成的linked-list,而bucket聚 阅读全文
摘要:
# 5.说一下C++左值引用和右值引用 C++11正是通过引入右值引用来优化性能,具体来说是通过移动语义来避免无谓拷贝的问题,通过move语义来将临时生成的左值中的资源无代价的转移到另外一个对象中去,通过完美转发来解决不能按照参数实际类型来转发的问题(同时,完美转发获得的一个好处是可以实现移动语义) 阅读全文
摘要:
# 4.迭代器:++it、it++哪个好,为什么 1.前置返回一个引用,后置返回一个对象 ```C++ // ++i实现代码为: int& operator++() { *this += 1; return *this; } ``` 2.前置不会产生临时对象,后置必须产生临时对象,临时对象会导致效率 阅读全文
摘要:
# 3.使用智能指针管理内存资源,RAII是怎么回事? 什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的 阅读全文
摘要:
# 2.解释一下什么是trivial destructor 什么是 trivial destructor和 non-trivial destructor 如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如 阅读全文
摘要:
# 1.什么是STL? C++STL从广义来讲包括了三类:算法,容器和迭代器。 - 算法包括排序,复制等常用算法,以及不同容器特定的算法。 - 容器就是数据的存放形式,包括顺序容器和关联式容器,顺序式容器就是list,vector等,关联式容器就是set,map等。 - 在C++中,迭代器是一种用于 阅读全文