STL-vector
【1】 vector本身的大小vector容器有三个指针:start,finish,end_of_storage,每个指针的大小为4,所以vector的大小为12.vector每次扩增都需要大量的使用拷贝构造函数和析构函数,拷贝构造函数将旧的元素复制到新的容器里面,析构函数释放空间【2】 说说std::vector的底层(存储)机制Vector就是一个动态数组,里面有一个指针,指向一片
【1】 vector本身的大小
vector容器有三个指针:start,finish,end_of_storage,每个指针的大小为4,所以vector的大小为12.vector每次扩增都需要大量的使用拷贝构造函数和析构函数,拷贝构造函数将旧的元素复制到新的容器里面,析构函数释放空间
【2】 说说std::vector的底层(存储)机制
Vector就是一个动态数组,里面有一个指针,指向一片连续的内存空间,当空间不够装下数据时,会自动申请一片更大的内存空间,一般增加当前容量的(50%或100%)然后把原来的数据拷贝过去,接着释放原来那片空间,当释放或者删除里面数据时,其存储空间不释放,仅仅是清空了里面的数据。
【3】 Std::vector的自增长机制
当分配的空间不能装下数据时,分配双倍当前容量的,把当前值拷贝到新分配的内存中,并释放原来的内存。
【4】 Vector的插入删除与list有什么区别
Vector的插入和删除需要对数据进行大量的复制和移动,如果vector存储的对象很大或者构造函数很复杂,则系统的开销会很大,如果以简单的小数据list优先;list插入和删除需要对现有的数据进行遍历,但是在首部插入数据,效率很高
【5】 Vector中begin和end函数返回什么
Begin返回第一个元素的迭代器,end返回最后一个元素后面位置的迭代器
【6】 为什么vector的插入操作可能会使迭代器失效
Vector动态增加时,并不是在原空间后增加新的空间,而是以原大小的2倍在另外配置一段较大的空间,然后将内容拷贝过来,并释放原来的空间,由于操作改变了空间,所以迭代器失效了
【7】 Vector list map deque用erase(it)后,迭代器的变化
(1) Vector和deque 是序列容器,其内存分别是连续空间和分段连续空间,删除迭代器之后,其后面的迭代器都失效了,此时it及其后面的迭代器都会自动加1,是it指向被删除元素的下一个元素
(2) List删除迭代器it之后,其后面的迭代器都不会失效,将前面与后面的连起来即可
(3) Map也是只能使当前删除的迭代器失效,其后面的迭代器依然有效
【8】 Vector是怎样释放内存的
一般我们释放vector里的元素使用clear,其他不能释放内存,要想释放内存就要用swap:先创建一个临时拷贝与原先的vector一致,值得注意的是,此时的拷贝其容量尽可能小的符合所需数据的,紧接着将该拷贝与原先的vector进行交换,执行交换以后,临时变量被销毁,内存得到了释放。
【9】 Vector并不是用自身来存储数据结构的,vector是从堆那里获取内存的,并用三个迭代器分别指向这块内存相应的位置,并进行管理,其次如果vector自身来存储元素,也难以达到重新配置空间的目的
【10】 一个空vector并不是指vector本身是空的,指的是vector没有管理,一块用于存储元素的内存,vector的本身大小是固定的12
【11】 Deque与vector最大的差异
Deque允许于常数时间内对起头端进行元素的插入或删除操作,deque没有所谓的容量观念,因为他是动态的,以分段连续空间组合而成,随时可以增加一段新的空间,并连接起来,deque没有必要提供空间保留功能
【12】 Vector<bool>与vector的区别,为什么要这样实现
(1) Vector<bool>有两个问题,第一:他不是STL容器,第二:它并不容纳bool
(2) Vector<bool>是一个伪容器,并不保存真正的bool,而是打包bool以节省空间
更多推荐
所有评论(0)