本文直面面试核心,系统梳理五大关键容器:从Vector的连续内存优势与扩容代价,到List的灵活插入与查找局限;从红黑树维持Map/Set有序性的平衡原理,到Deque分段结构的实现智慧。我们将穿透概念表象,直击面试官最关注的底层原理与设计取舍。
理解容器,就是理解C++性能优化的核心逻辑。让我们开始这场面向实战的深度解析。
std::vector 连续内存分布天然的符合这一特性。那么当访问vector中的某一个元素时,会将一整个内存数据块加载到高速缓存中,后续访问到同一行中的元素时,直接命中高速缓存std::set 和 std::map 在C++标准库中都是基于平衡二叉树实现的(一般是红黑树)std::set 仅储存键值,而 std::map 储存键值对std::set 存储的键就是元素本身,而 std::map 存储的键值是键,值是与键相关联的数据C++中的map、set、multimap、multiset都是标准库中的关联容器,都是基于红黑树实现的,下面是它们的详细区别:
std::map
std::set
std::multimap
std::multiset
std::map<int, std::string> myMap;
myMap[1] = "one";
myMap[2] = "two";
auto it = myMap.find(1);
if (it != myMap.end()) {
std::cout << "Found: " << it->second << std::endl;
} else {
std::cout << "Not found" << std::endl;
}std::map ,键是唯一的,所以要么返回0要么是1size_t count = myMap.count(1);
if (count > 0) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}auto lower = myMap.lower_bound(1);
auto upper = myMap.upper_bound(1);
if (lower != upper) {
std::cout << "Found: " << lower->second << std::endl;
}auto range = myMap.equal_range(1);
if (range.first != range.second) {
std::cout << "Found: " << range.first->second << std::endl;
}std::set<int> mySet;
mySet.insert(1);
mySet.insert(2);
auto it = mySet.find(1);
if (it != mySet.end()) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}size_t count = mySet.count(1);
if (count > 0) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}auto lower = myMap.lower_bound(1);
auto upper = myMap.upper_bound(1);
if (lower != upper) {
std::cout << "Found: " << lower->second << std::endl;
}auto range = myMap.equal_range(1);
if (range.first != range.second) {
std::cout << "Found: " << range.first->second << std::endl;
}std::map :
std::deque: