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 的特性和使用方法,程序员可以根据需求选择合适的容器,优化程序的性能和可维护性。各容器的实际使用示例展示了它们的基本操作和特点,帮助开发人员在实际编程中做出明智的选择。