答案:
对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。
编译系统在我们没有自己定义拷贝构造函数时,会在拷贝对象时调用默认拷贝构造函数,进行的是浅拷贝,浅拷贝(释放时,因为多次释放出错,如果里面有指针就会出现不同对象对同一个内存进行是否)。
在对含有指针成员的对象进行拷贝时,必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间,即进行深拷贝,这样就避免了内存出现两次释放发生。
总结:
浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,
深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
如何区分深拷贝深拷贝深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝; 如果B没变,那就是深拷贝!
答案:
友元有两种形式:
友元函数:友元函数的声明,声明位置没有关系。
友元类:类中的有些成员只能通过类提供的函数进行访问,这会增加程序书写的麻烦,所以就搞了个友元friend,通过友元就可以访问类中的私有和保护成员。
缺点:破坏了类的封装性和数据的透明性
答案:
普通函数(非成员函数),静态成员函数,内联成员函数,构造函数,友元函数。
答案:
vector底层是数组,List是双链表
vector支持随机访问,list不支持
vector是顺序内存
vecotr随机访问性能好,插入删除性能差,list相反
vecor一次性分配好内存,不够才被进行扩容,list每次插入一个节点都会进行内存申请
答案:
答案:
1) 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。
2)对于序列式容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。还好erase方法可以返回下一个有效的iterator。
3)对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator,因此上面两种正确的方法都可以使用。
答案:
迭代器类型主要支持两类,随机访问和双向访问。
其中vector和deque支持随机访问,list,set,map等支持双向访问。
答案:
要实现一个智能指针,可以按照以下步骤进行:
创建一个类,作为智能指针的封装。这个类将管理底层指针,并提供安全和方便的操作。
在类中添加一个私有成员变量,用于存储底层指针。
实现构造函数,接受一个原始指针作为参数,并将其存储在私有成员变量中。可以在构造函数中对指针进行必要的检查和处理。
实现析构函数,用于在对象销毁时释放底层指针所占用的资源。这可以确保在不再使用智能指针时,底层资源得到正确释放。
重载箭头运算符(->)和解引用运算符(*),以模拟指针的行为。这样可以通过智能指针直接访问底层对象的成员或方法。
实现拷贝构造函数和赋值运算符重载,以确保在使用智能指针进行复制或赋值时,底层资源得到正确管理。一般情况下,需要使用引用计数来追踪底层资源的使用情况。
可以考虑实现其他辅助功能,如判空函数、获取原始指针的函数等。
对于多线程环境,需要考虑使用互斥锁和原子操作来确保智能指针的线程安全性。
答案:
答案:
map和set都是c++的关联容器,底层都是红黑树
区别:
map中的元素是键值对,set只是关键字的集合,所以set中元素只包含一个关键字
set的迭代器是const,不允许修改元素的值
map允许修改value,但不允许修改key
原因:根据关键字来保证容器有序性,如果修改key的话,那么首先删除该建,然后调节平衡,再依据修改后的建值,调节平衡,这样一来破坏map和set的结构,iterator失效。
答案:
分配内存:allocator可以根据需要动态地分配内存,为容器中的对象分配存储空间。它能够根据对象类型的大小和对齐要求,有效地分配内存。
构造和销毁对象:allocator封装了对象的构造和销毁过程,使得在分配的内存空间上可以正确地构造对象并在使用完毕后销毁对象,确保内存的正确管理。
空间管理:allocator可以管理对象的内存空间,包括空间的分配、释放和重新分配,从而提供高效的内存管理方式。
抽象底层内存管理:allocator将内存分配的细节进行了抽象,使得容器类不需要关心具体的内存分配算法和实现细节,从而提高了代码的可移植性和灵活性。
答案:
map是使用红黑树实现,unordered_map是使用hash表来完成映射功能。
map是按照operator<比较判断元素是否相同,及比较元素的大小,然后选择一个合适位置插入其中,所以对map遍历的话是有序的。
unordered_map是计算元素的hash值,根据hash的值判断元素是否相同,所以对unordered_map遍历是无序的。