【C++ 面试 - STL】每日 3 题(六)

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

16. STL 中 list 与 queue 之间的区别

  1. list 不再能够像 vector 一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在;
  2. list 插入操作和结合才做都不会造成原有的 list 迭代器失效;
  3. list 不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针;
  4. list 不像 vector 那样有可能在空间不足时做重新配置、数据移动的操作,所以插入前的所有迭代器在插入操作之后都仍然有效;
  5. deque 是一种双向开口的连续线性空间,所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作;可以在头尾两端分别做元素的插入和删除操作;
  6. 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 对象,可能会导致竞态条件和数据不一致性。可使用以下方法使其线程安全:

  1. 使用互斥锁:你可以在访问和修改 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;
}
  1. 避免共享状态:最安全的方法是避免共享可变状态。如果可能的话,设计你的多线程应用程序,使不同线程之间的数据共享最小化,从而减少竞态条件的机会。
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL是指标准模板库(Standard Template Library),它是C++语言的一部分,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的目标是提供高效、可重用和可扩展的组件,以便开发人员能够更轻松地编写高质量的代码。STL包含了许多常见的数据结构,如vector、list、set、map等,以及各种算法,比如排序、查找、遍历等。通过使用STL开发人员可以更加高效地处理各种数据结构和算法的问,提高代码的开发效率和质量。 在STL中,我们可以使用各种容器来存储和管理数据。例如,我们可以使用std::map来创建一个键值对的映射,其中每个键都有一个与之相关联的值。下面是一个示例代码,展示了如何创建和使用一个std::map对象: std::map<std::string, int> disMap() { std::map<std::string, int> tempMap{ {"C语言教程",10},{"STL教程",20} }; return tempMap; } std::map<std::string, int> newMap(disMap()); 在这个示例中,disMap()函数创建了一个临时的std::map对象,并初始化了其中的一些键值对。然后,使用移动构造函数将这个临时对象移动到了一个新的std::map对象newMap中。最终,我们可以通过newMap对象来访问和操作这些键值对。 综上所述,STLC++中的标准模板库,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的使用可以提高代码的开发效率和质量,并且通过各种容器和算法,可以方便地处理各种数据结构和算法的问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL详解超全总结(快速入门STL)](https://blog.csdn.net/qq_50285142/article/details/114026148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++实验】阅读STL源码并分析](https://blog.csdn.net/qq_35760825/article/details/125311509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值