面试题总结(四) – STL与算法篇
文章目录
- 面试题总结(四) -- STL与算法篇
-
-
- <1> 请列举 C++ STL 中常用的容器(如 vector、list、map 等)及其特点。
- <2> 如何在 C++ 中使用 STL 算法(如排序、查找等)?
- <3> 解释 STL 迭代器的概念和作用。
- <4> C++ 中 map 和 unordered_map 的区别是什么?
- <5> 谈谈 STL 中容器适配器(stack、queue、priority_queue)的使用。
- <6> 如何自定义 C++ STL 容器的比较函数?
- <7> 描述 C++ 中算法的复杂度分析(时间复杂度和空间复杂度)。
- <8> 举例说明在 C++ 中如何使用 STL 进行数据的批量处理。
- <9> 解释 C++ 中函数对象(functor)在 STL 中的应用。
- <10> 如何解决 C++ 中 STL 容器的迭代器失效问题?
-
<1> 请列举 C++ STL 中常用的容器(如 vector、list、map 等)及其特点。
vector (向量):
- 特点: 动态数组,内存连续存储,支持随机访问,在尾部添加和删除元素效率高,在中间插入和删除元素效率低。
- 理由: 连续存储使得随机访问速度快,但中间插入删除需要移动大量元素。
list (链表):
- 特点: 双向链表,非连续存储,在任意位置插入和删除元素效率高,不支持随机访问。
- 理由: 链表结构决定了插入删除操作只需修改指针,无需移动元素,但随机访问需要遍历。
map (映射):
- 特点: 基于红黑树实现的键值对数据结构,按键有序存储,查找、插入和删除的平均时间复杂度为 O(log n)。
- 理由: 红黑树的特性保证了元素的有序性和较好的查找效率。
unordered_map (无序映射):
- 特点: 基于哈希表实现,查找、插入和删除的平均时间复杂度为 O(1),元素无序。
- 理由: 哈希表的特性使得查找速度快,但不保证元素顺序。
<2> 如何在 C++ 中使用 STL 算法(如排序、查找等)?
排序:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {
5, 2, 8, 1, 3};
std::sort(numbers.begin(), numbers.end());
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
理由: std::sort
函数接受两个迭代器指定排序范围,对范围内的元素进行排序。
查找:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {
5, 2, 8, 1, 3};
auto it = std::find(numbers.begin(), numbers.end(), 8);
if (it != numbers.end()) {
std::cout << "找到了 8"