C++ STL 常用容器使用实例
C++ 标准模板库 (STL) 提供了一系列强大且高效的数据结构容器,帮助程序员简化编程任务。以下将对 STL 中常用的容器进行详细解析,并提供实际使用示例。
1. vector
1.1 概述
vector 是 STL 中的一个动态数组容器,支持快速随机访问。它的元素在内存中是连续存储的,因此可以高效地进行读写操作。vector 可以动态调整大小,但插入和删除操作可能会导致较高的开销,尤其是在中间位置。
1.2 使用示例
#include <iostream>
#include <vector>
int main() {
// 创建一个 vector,并初始化一些值
std::vector<int> vec = {1, 2, 3, 4, 5};
// 访问 vector 的元素
std::cout << "vec[2] = " << vec[2] << std::endl;
// 添加元素
vec.push_back(6);
// 删除元素
vec.pop_back();
// 遍历 vector
for (const auto& elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
1.3 关键操作
push_back(value): 在vector末尾添加元素。pop_back(): 删除vector末尾的元素。at(index): 访问指定位置的元素(检查越界)。size(): 获取vector中的元素数量。clear(): 清空vector中的所有元素。
2. list
2.1 概述
list 是 STL 中的双向链表容器,支持高效的插入和删除操作。由于其内部是链表结构,随机访问的效率较低,但在中间插入和删除操作较为高效。
2.2 使用示例
#include <iostream>
#include <list>
int main() {
// 创建一个 list,并初始化一些值
std::list<int> lst = {1, 2, 3, 4, 5};
// 添加元素
lst.push_back(6);
lst.push_front(0);
// 删除元素
lst.pop_back();
lst.pop_front();
// 遍历 list
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
2.3 关键操作
push_back(value): 在list末尾添加元素。push_front(value): 在list开头添加元素。pop_back(): 删除list末尾的元素。pop_front(): 删除list开头的元素。size(): 获取list中的元素数量。clear(): 清空list中的所有元素。
3. deque
3.1 概述
deque(双端队列)是一种允许在两端快速插入和删除的容器。与 vector 相比,deque 支持在两端进行插入和删除操作,并且通常可以提供比 list 更好的随机访问性能。
3.2 使用示例
#include <iostream>
#include <deque>
int main() {
// 创建一个 deque,并初始化一些值
std::deque<int> dq = {1, 2, 3, 4, 5};
// 添加元素
dq.push_back(6);
dq.push_front(0);
// 删除元素
dq.pop_back();
dq.pop_front();
// 遍历 deque
for (const auto& elem : dq) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
3.3 关键操作
push_back(value): 在deque末尾添加元素。push_front(value): 在deque开头添加元素。pop_back(): 删除deque末尾的元素。pop_front(): 删除deque开头的元素。size(): 获取deque中的元素数量。clear(): 清空deque中的所有元素。
4. set
4.1 概述
set 是 STL 中的一个集合容器,存储唯一的元素,并自动排序。它的内部实现通常是基于红黑树,提供对元素的对数时间复杂度的查找、插入和删除操作。
4.2 使用示例
#include <iostream>
#include <set>
int main() {
// 创建一个 set,并初始化一些值
std::set<int> s = {1, 2, 3, 4, 5};
// 添加元素
s.insert(6);
// 删除元素
s.erase(3);
// 遍历 set
for (const auto& elem : s) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
4.3 关键操作
insert(value): 插入元素(元素唯一)。erase(value): 删除指定的元素。find(value): 查找指定的元素。size(): 获取set中的元素数量。clear(): 清空set中的所有元素。
5. map
5.1 概述
map 是 STL 中的一个关联容器,存储键值对并根据键自动排序。其内部实现通常是基于红黑树,提供对键的对数时间复杂度的查找、插入和删除操作。
5.2 使用示例
#include <iostream>
#include <map>
int main() {
// 创建一个 map,并初始化一些键值对
std::map<std::string, int> m = {{"apple", 3}, {"banana", 2}, {"cherry", 5}};
// 添加键值对
m["date"] = 4;
// 删除键值对
m.erase("banana");
// 查找键值对
auto it = m.find("apple");
if (it != m.end()) {
std::cout << "apple: " << it->second << std::endl;
}
// 遍历 map
for (const auto& pair : m) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
5.3 关键操作
insert({key, value}): 插入键值对(键唯一)。erase(key): 删除指定的键值对。find(key): 查找指定的键。size(): 获取map中的键值对数量。clear(): 清空map中的所有键值对。
6. unordered_map
6.1 概述
unordered_map 是 STL 中的哈希表实现的关联容器,提供对键的常数时间复杂度的查找、插入和删除操作。与 map 不同,unordered_map 不会对元素进行排序。
6.2 使用示例
#include <iostream>
#include <unordered_map>
int main() {
// 创建一个 unordered_map,并初始化一些键值对
std::unordered_map<std::string, int> um = {{"apple", 3}, {"banana", 2}, {"cherry", 5}};
// 添加键值对
um["date"] = 4;
// 删除键值对
um.erase("banana");
// 查找键值对
auto it = um.find("apple");
if (it != um.end()) {
std::cout << "apple: " << it->second << std::endl;
}
// 遍历 unordered_map
for (const auto& pair : um) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
6.3 关键操作
insert({key, value}): 插入键值对(键唯一)。erase(key): 删除指定的键值对。find(key): 查找指定的键。size(): 获取unordered_map中的键值对数量。clear(): 清空unordered_map中的所有键值对。
7.
priority_queue
7.1 概述
priority_queue 是 STL 中的优先队列容器,支持按优先级顺序进行元素的插入和删除。默认情况下,priority_queue 使用最大堆实现,即优先级最高的元素位于队列的顶部。
7.2 使用示例
#include <iostream>
#include <queue>
int main() {
// 创建一个 priority_queue,并初始化一些值
std::priority_queue<int> pq;
pq.push(5);
pq.push(1);
pq.push(10);
// 访问最大元素
std::cout << "Top element: " << pq.top() << std::endl;
// 删除最大元素
pq.pop();
// 遍历 priority_queue(需要复制到临时队列中)
std::priority_queue<int> temp = pq;
while (!temp.empty()) {
std::cout << temp.top() << " ";
temp.pop();
}
std::cout << std::endl;
return 0;
}
7.3 关键操作
push(value): 向priority_queue插入元素。pop(): 删除priority_queue中的最大元素。top(): 获取priority_queue中的最大元素。size(): 获取priority_queue中的元素数量。
总结
STL 提供了丰富的容器选择,每种容器都有其特定的适用场景。通过理解 vector、list、deque、set、map、unordered_map 和 priority_queue 的特性和使用方法,程序员可以根据需求选择合适的容器,优化程序的性能和可维护性。各容器的实际使用示例展示了它们的基本操作和特点,帮助开发人员在实际编程中做出明智的选择。


