STL模板:容器与算法

第二天:STL 模板 - 图1

1. STL 介绍

1.1 什么是 STL?

  • STL (Standard Template Library):C++ 标准库的一部分,提供高效、可重用的数据结构和算法。
  • 主要组成部分:
    • 容器 (Containers):存储数据的结构。
    • 算法 (Algorithms):对容器中的数据进行操作的函数。
    • 迭代器 (Iterators):访问容器元素的对象。
    • 函数对象 (Function Objects):可作为参数传递的对象。

2. STL 容器

2.1 序列容器 (Sequence Containers)

  • vector:动态数组,支持快速随机访问。
  • deque:双端队列,支持从两端插入和删除元素。
  • list:双向链表,支持高效的插入和删除操作。
  • array:固定大小数组,支持快速访问。

示例:

  1. #include <iostream>
  2. #include <vector>
  3. int main() {
  4. std::vector<int> vec = {1, 2, 3, 4, 5};
  5. vec.push_back(6); // 添加元素
  6. for (int val : vec) {
  7. std::cout << val << " "; // 输出 1 2 3 4 5 6
  8. }
  9. return 0;
  10. }

2.2 关联容器 (Associative Containers)

  • set:集合,存储唯一元素并自动排序。
  • map:映射,存储键值对并自动根据键排序。
  • unordered_set:无序集合,基于哈希表实现,查找效率高。
  • unordered_map:无序映射,基于哈希表实现,查找效率高。

示例:

  1. #include <iostream>
  2. #include <set>
  3. int main() {
  4. std::set<int> s = {1, 2, 3, 4};
  5. s.insert(5); // 插入元素
  6. for (int val : s) {
  7. std::cout << val << " "; // 输出 1 2 3 4 5
  8. }
  9. return 0;
  10. }

2.3 容器适配器 (Container Adapters)

  • stack:栈,基于 deque 实现。
  • queue:队列,基于 deque 实现。
  • priority_queue:优先队列,基于堆实现。

示例:

  1. #include <iostream>
  2. #include <stack>
  3. int main() {
  4. std::stack<int> s;
  5. s.push(1);
  6. s.push(2);
  7. while (!s.empty()) {
  8. std::cout << s.top() << " "; // 输出 2 1
  9. s.pop();
  10. }
  11. return 0;
  12. }

3. STL 迭代器

3.1 迭代器概述

  • 迭代器是用于访问容器中元素的对象,类似于指针。
  • 常见操作:
    • begin()end():获取容器的开始和结束位置。
    • ++:迭代器的递增。
    • *:解引用,获取迭代器指向的元素。

示例:

  1. #include <iostream>
  2. #include <vector>
  3. int main() {
  4. std::vector<int> vec = {1, 2, 3, 4, 5};
  5. for (auto it = vec.begin(); it != vec.end(); ++it) {
  6. std::cout << *it << " "; // 输出 1 2 3 4 5
  7. }
  8. return 0;
  9. }

3.2 范围基 for 循环

  • C++11 引入了范围基 for 循环,使得遍历容器更加简洁。

示例:

  1. #include <iostream>
  2. #include <vector>
  3. int main() {
  4. std::vector<int> vec = {1, 2, 3, 4, 5};
  5. for (int val : vec) {
  6. std::cout << val << " "; // 输出 1 2 3 4 5
  7. }
  8. return 0;
  9. }

4. STL 算法

4.1 常用算法

  • sort():排序容器中的元素。
  • find():查找容器中的元素。
  • reverse():反转容器中的元素。
  • accumulate():计算容器中所有元素的和。

示例:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <numeric>
  5. int main() {
  6. std::vector<int> vec = {1, 2, 3, 4, 5};
  7. std::sort(vec.begin(), vec.end(), std::greater<int>());
  8. for (int val : vec) {
  9. std::cout << val << " "; // 输出 5 4 3 2 1
  10. }
  11. int sum = std::accumulate(vec.begin(), vec.end(), 0);
  12. std::cout << "\nSum: " << sum; // 输出 Sum: 15
  13. return 0;
  14. }

4.2 容器与算法结合

  • STL 的算法可以与容器配合使用,简化代码,提升开发效率。

示例:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. int main() {
  5. std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2};
  6. auto it = std::find(vec.begin(), vec.end(), 4);
  7. if (it != vec.end()) {
  8. std::cout << "Found: " << *it << std::endl; // 输出 Found: 4
  9. }
  10. vec.erase(std::remove(vec.begin(), vec.end(), 1), vec.end());
  11. for (int val : vec) {
  12. std::cout << val << " "; // 输出 3 4 5 9 2
  13. }
  14. return 0;
  15. }

5. 总结

  • STL 提供了强大的容器、算法和迭代器功能,简化了代码并提高了开发效率。
  • 理解 STL 容器和算法的使用方式是成为 C++ 高效开发者的关键。
  • 学习模板编程的基础,有助于理解 STL 的泛型编程。

6. 练习与作业

6.1 练习

  1. 使用 vector 容器存储 10 个随机整数,排序并输出。
  2. 使用 map 容器统计一个字符串中各个字符的频率。
  3. 实现一个简单的函数,接受一个 stack 容器并返回其栈顶元素。

6.2 作业

  1. set 容器实现一个简易的集合操作,支持添加、删除和查找元素。
  2. 编写一个程序,使用 priority_queue 实现一个优先级队列。
  3. 使用 accumulate 计算并输出一个 vector 中所有元素的平均值。