在C++编程中,标准库容器是编程人员日常工作中不可或缺的工具。这些容器提供了对数据的抽象存储和操作,使得我们可以专注于实现程序的逻辑,而无需担心底层的数据存储和访问细节。本文将介绍C++标准库中的一些主要容器,包括它们的特点、使用方法和一些最佳实践。
1. 容器概述
C++标准库提供了多种类型的容器,每种容器都有其特定的用途和优势。以下是一些常用的容器:
· 序列容器:用于存储同一类型的元素,并且可以通过索引访问元素。常见的序列容器有vector、deque、list、forward_list、array和string(尽管string主要用于存储字符序列,但也可以视为一种序列容器)。
· 关联容器:用于存储键值对,并根据键来存储和检索元素。常见的关联容器有set、multiset、map和multimap。
· 容器适配器:对序列容器进行封装,提供不同的接口或行为。常见的容器适配器有stack、queue和priority_queue。
2. 序列容器
2.1 vector
vector是一个动态数组,可以容纳任意数量的元素。它支持随机访问,即可以在常数时间内访问任何元素。vector在尾部添加或删除元素通常很快,但在头部或中间插入或删除元素可能较慢,因为可能需要重新分配内存并移动元素。
示例:
cpp复制代码
|
#include <iostream> |
|
#include <vector> |
|
|
|
int main() { |
|
std::vector<int> v = {1, 2, 3, 4, 5}; |
|
std::cout << "Element at index 2: " << v[2] << std::endl; |
|
v.push_back(6); // Add element to the end |
|
std::cout << "Size of vector: " << v.size() << std::endl; |
|
return 0; |
|
} |
2.2 list
list是一个双向链表,可以在任何位置快速插入或删除元素。但它不支持随机访问,访问元素需要从头或尾开始遍历。
示例:
cpp复制代码
|
#include <iostream> |
|
#include <list> |
|
|
|
int main() { |
|
std::list<int> l = {1, 2, 3, 4, 5}; |
|
l.push_front(0); // Add element to the beginning |
|
l.push_back(6); // Add element to the end |
|
std::cout << "First element: " << l.front() << std::endl; |
|
std::cout << "Last element: " << l.back() << std::endl; |
|
return 0; |
|
} |
3. 关联容器
3.1 set
set是一个包含唯一元素的集合,每个元素都有一个唯一的键。set中的元素默认按升序排序。
示例:
cpp复制代码
|
#include <iostream> |
|
#include <set> |
|
|
|
int main() { |
|
std::set<int> s = {3, 1, 4, 1, 5, 9, 2}; |
|
for (const auto& elem : s) { |
|
std::cout << elem << ' '; |
|
} |
|
std::cout << std::endl; // Output: 1 2 3 4 5 9 |
|
return 0; |
|
} |
3.2 map
map是一个关联数组或哈希表,它包含键值对,并允许通过键来快速检索值。map中的元素默认按键的升序排序。
示例:
cpp复制代码
|
#include <iostream> |
|
#include <map> |
|
|
|
int main() { |
|
std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}, {"cherry", 3}}; |
|
m["orange"] = 4; // Add a new element |
|
std::cout << "Number of apples: " << m["apple"] << std::endl; |
|
return 0; |
|
} |
4. 容器适配器
4.1 stack
stack是一个后进先出(LIFO)的数据结构,通常基于deque或list实现。它只提供了对栈顶元素的访问和操作。
示例:
cpp复制代码
|
#include <iostream> |
|
#include <stack> |