✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
16. STL 中 list 与 queue 之间的区别
- list 不再能够像 vector 一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在;
- list 插入操作和结合才做都不会造成原有的 list 迭代器失效;
- list 不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针;
- list 不像 vector 那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代器在插入操作之后都仍然有效;
- deque 是一种双向开口的连续线性空间,所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作;可以在头尾两端分别做元素的插入和删除操作;
- deque 和 vector 最大的差异,一在于 deque 允许常数时间内对起头端进行元素的插入或移除操作,二在于 deque 没有所谓容量概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,deque 没有所谓的空间保留功能。
17. vector 和 array 区别
相同点
- 都能用下标来访问元素。
- 都是顺序容器,采用的是顺序的存储空间。
不同点 - 创建方式上不同
- vector 无需指定大小,只需指定类型,e.g. vector a。
- array 需要同时指定类型和大小,e.g. array<int, 3> a。
- 内存使用上不同
- vector 需要占据比 array 更多的内存,因为其内存空间大小是动态可变的。
- 内存高效的,用多少就申请多少。
- 效率上不同
- vector 效率偏低,因为当向 vector 中添加新元素的时候,内存空间不够,需要重新申请更大的空间,由于 vector 是连续内存空间的,因此其申请更多空间的时候,可能整个位置发生改变,需要将原来空间里的数据拷贝过去。
- 下标类型不同
- 在用下标访问元素时,vector 使用 vector::size_type 作为下标的类型,而数组下标的正确类型则是 size_t;
- swap 操作不同
- vector 是将引用进行交换,效率高,其迭代器指向原来的容器(原来的容器中的元素指向的却是另一个容器的值),但是 end 的引用并没有发生交换,因此在输出的时候注意别用 end 作为迭代终止条件。
- array 是进行值的交换,效率低,且迭代器仍指向原来的容器。
18. map 是线程安全的吗?能使得 map 线程安全吗?
它本身并不是线程安全的。这就意味着如果多个线程同时访问和修改同一个 std::map 对象,可能会导致竞态条件和数据不一致性。可使用以下方法使其线程安全:
- 使用互斥锁:你可以在访问和修改 std::map 的操作前使用互斥锁(Mutex)来锁定,确保在任何时刻只有一个线程可以访问或修改该 std::map。但可能会降低多线程程序的性能。
#include <iostream>
#include <map>
#include <mutex>
std::map<int, int> myMap;
std::mutex mtx;
void addToMap(int key, int value) {
std::lock_guard<std::mutex> lock(mtx); // 锁定互斥锁
myMap[key] = value; // 修改 std::map
}
int main() {
// 启动多个线程调用 addToMap 函数
// ...
return 0;
}
- 避免共享状态:最安全的方法是避免共享可变状态。如果可能的话,设计你的多线程应用程序,使不同线程之间的数据共享最小化,从而减少竞态条件的机会。