问题1: STL中包含哪些主要组件?
答案: STL主要包含四类组件:容器(Containers)、算法(Algorithms)、迭代器(Iterators)、和函数对象(Function Objects)。容器如vector、map存储数据;算法如sort、find操作数据;迭代器提供访问容器内元素的方法。
问题2: 解释C++ STL中的向量(vector)和如何使用它。
答案: std::vector是一个动态数组,可以在运行时调整大小。它提供随机访问,可以快速在末尾添加或删除元素。
示例代码:
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6);
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
问题3: STL中的迭代器有哪些类型?
答案: STL迭代器主要有五种类型:输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器。它们提供了不同级别的访问和遍历容器的能力。
问题4: 什么是关联容器,举例说明。
答案: 关联容器是基于键来存储和检索元素的容器,如std::map和std::set。它们通常实现为二叉搜索树或哈希表。
问题5: 解释C++ STL中map的基本用法。
答案: std::map是一个存储键值对的关联容器,其中每个键唯一。它提供了快速的查找、插入和删除操作。
示例代码:
#include <map>
#include <iostream>
int main() {
std::map<std::string, int> ageMap;
ageMap["Alice"] = 30;
ageMap["Bob"] = 25;
std::cout << "Bob's age: " << ageMap["Bob"] << std::endl;
return 0;
}
问题6: STL中的sort算法是如何工作的?
答案: std::sort通常使用快速排序或类似算法,在平均情况下提供O(n log n)的排序效率。它可以对容器内的元素范围进行排序。 示例代码:
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {4, 1, 3, 2, 5};
std::sort(vec.begin(), vec.end());
for (int num : vec) {
std::cout << num << " ";
}
return 0;
}
问题7: STL中的find算法是用来做什么的?
答案: std::find用于在给定范围内查找特定值的第一个出现,如果找到,返回指向该元素的迭代器;否则返回结束迭代器。
问题8: 如何在C++ STL中使用std::pair?
答案: std::pair用于存储一对值,这两个值可以是不同类型。std::pair常用于关联容器中。 示例代码:
#include <utility>
#include <iostream>
int main() {
std::pair<std::string, int> myPair("Alice", 30);
std::cout << myPair.first << ": " << myPair.second << std::endl;
return 0;
}
问题9: STL中的emplace_back和push_back有什么区别?
答案: emplace_back直接在容器末尾构造元素,而push_back将元素复制或移动到容器末尾。emplace_back通常更高效,因为它避免了不必要的复制。
问题10: 解释C++ STL中的std::deque容器。
答案: std::deque(双端队列)是一个动态数组,允许在两端快速插入和删除元素。与vector相比,它在头部添加元素更高效。
问题11: C++ STL中的std::list和std::vector有什么主要区别?
答案: std::list是一个双向链表,支持在任意位置高效插入和删除操作,但不支持随机访问。std::vector是一个动态数组,支持快速随机访问,但在中间位置插入或删除元素较慢。
问题12: STL中std::set和std::unordered_set有什么不同? 答案: std::set基于红黑树实现,元素按顺序存储,查找时间为O(log n)。std::unordered_set基于哈希表实现,元素无序,平均查找时间为O(1)。
问题13: 解释C++ STL中的堆算法。 答案: STL提供了std::make_heap、std::push_heap、std::pop_heap等函数来操作容器作为堆。这些算法用于创建和管理优先队列。
问题14: STL中的迭代器失效是什么意思? 答案: 迭代器失效指的是由于底层容器的修改(如添加、删除元素),迭代器指向的元素不再存在或不再有效,从而导致未定义行为。
问题15: C++ STL中如何使用std::advance和std::next? 答案: std::advance用于将迭代器向前或向后移动指定的距离。std::next返回迭代器向前移动指定距离后的新迭代器,但不改变原迭代器。
问题16: STL中的std::copy和std::copy_if有什么区别? 答案: std::copy将元素从一个范围复制到另一个范围。std::copy_if仅复制满足特定条件的元素。
问题17: 如何在STL中使用lambda表达式作为比较函数? 答案: Lambda表达式可以作为自定义比较函数传递给STL算法,如std::sort,来定义元素的排序规则。 示例代码:
std::vector<int> vec = {4, 1, 3, 2, 5};
std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; });
问题18: C++ STL中的std::accumulate是用来做什么的?
答案: std::accumulate用于计算给定范围内所有元素的累加和或进行累积运算,也可以接受一个自定义的二元操作函数。
问题19: STL中的std::transform如何使用?
答案: std::transform对范围内的每个元素应用给定的函数,并将结果存储在另一个范围内。 示例代码:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> result(vec.size());
std::transform(vec.begin(), vec.end(), result.begin(), [](int x) { return x * x; });
问题20: 解释C++中的std::function和它在STL中的用途。
答案: std::function是一个泛型函数包装器,可以存储、复制和调用任何可调用的目标。它常用于STL算法中,用于存储回调函数、比较函数等。
问题21: C++ STL中std::vector::reserve()和std::vector::resize()有什么区别?
答案: reserve()只改变vector的容量,但不改变其大小。resize()改变vector的大小,如果新大小大于当前大小,则会添加元素。
问题22: 如何在STL中删除容器中满足特定条件的元素?
答案: 可以使用std::remove_if结合erase方法。remove_if重排元素,然后erase删除多余的元素。 示例代码:
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; }), vec.end());
问题23: STL中std::nth_element是做什么的?
答案: std::nth_element重新排列元素,使得第n个元素处于其最终排序位置,所有小于这个元素的都在其前面,大于它的都在其后面。
问题24: C++ STL中std::map和std::multimap有什么区别?
答案: std::map中每个键只能关联一个值,而std::multimap允许多个元素有相同的键。
问题25: 如何在C++中使用STL的std::priority_queue?
答案: std::priority_queue是一个容器适配器,提供常数时间的最大元素查找,对数时间的插入和删除。通常用于实现堆。 示例代码:
std::priority_queue<int> pq;
pq.push(3);
pq.push(5);
pq.push(1);
std::cout << pq.top(); // 输出: 5
问题26: 解释C++中STL迭代器的失效规则。
答案: 当容器进行插入、删除操作时,指向容器元素的迭代器可能会失效。例如,向vector添加元素可能导致所有迭代器失效,因为它可能会重新分配内存。
问题27: STL中std::lower_bound和std::upper_bound的区别是什么?
答案: std::lower_bound返回指向不小于给定值的第一个元素的迭代器。std::upper_bound返回指向大于特定值的第一个元素的迭代器。
问题28: 在STL中,std::unique函数的作用是什么?
答案: std::unique用于移除相邻的重复元素,只保留每组相同元素的第一个。注意,它不会改变容器大小,通常与erase结合使用。
问题29: 如何在STL中创建和使用自定义分配器?
答案: 自定义分配器允许控制容器内存分配的过程。它需要实现一组特定的函数,然后可以作为模板参数传递给STL容器。
问题30: C++ STL中的std::next_permutation有什么用?
答案: std::next_permutation用于生成给定范围的下一个字典序排列,如果存在,则返回true,否则返回false,此时排列为最小排列。 示例代码:
std::vector<int> vec = {1, 2, 3};
do {
for (int num : vec) std::cout << num << " ";
std::cout << std::endl;
} while (std::next_permutation(vec.begin(), vec.end()));
原文链接:C++ STL常见面试题 - 知乎