11-C++模板库(STL)容器、迭代器和算法详解

V信公众号: 程序员架构笔记

C++ 标准模板库(STL,Standard Template Library)是 C++ 标准库的一部分,提供了丰富的通用数据结构和算法。STL 的核心组件包括容器迭代器算法。以下是对这些组件的简要介绍:


1. 容器(Containers)

容器是用于存储数据的对象。STL 提供了多种容器,分为以下几类:

顺序容器(Sequence Containers)
  • vector:动态数组,支持快速随机访问,尾部插入和删除效率高。

  • list:双向链表,支持高效的插入和删除操作,但不支持随机访问。

  • deque:双端队列,支持在头部和尾部高效插入和删除,支持随机访问。

关联容器(Associative Containers)
  • set:有序集合,元素唯一,基于红黑树实现。

  • multiset:允许重复元素的有序集合。

  • map:键值对的有序映射,键唯一。

  • multimap:允许重复键的有序映射。

无序关联容器(Unordered Associative Containers)
  • unordered_set:基于哈希表的无序集合,元素唯一。

  • unordered_multiset:允许重复元素的无序集合。

  • unordered_map:基于哈希表的无序键值对映射。

  • unordered_multimap:允许重复键的无序映射。

容器适配器(Container Adaptors)
  • stack:后进先出(LIFO)的栈。

  • queue:先进先出(FIFO)的队列。

  • priority_queue:优先队列,元素按优先级排序。


2. 迭代器(Iterators)

迭代器是用于遍历容器中元素的对象,类似于指针。它提供了统一的访问容器元素的方式。迭代器分为以下几类:

  • 输入迭代器(Input Iterator):只能读取元素,单向移动。

  • 输出迭代器(Output Iterator):只能写入元素,单向移动。

  • 前向迭代器(Forward Iterator):支持读写,单向移动。

  • 双向迭代器(Bidirectional Iterator):支持双向移动(如 list 的迭代器)。

  • 随机访问迭代器(Random Access Iterator):支持随机访问(如 vector 的迭代器)。

示例:
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
    std::cout << *it << " "; // 输出:1 2 3 4 5
}

3. 算法(Algorithms)

STL 提供了大量通用算法,用于对容器中的元素进行操作。这些算法通过迭代器与容器解耦,适用于多种容器。

常用算法:
  • 排序算法

    • sort:对范围内的元素进行排序。

    std::vector<int> vec = {5, 3, 1, 4, 2};
    std::sort(vec.begin(), vec.end()); // 排序后:1 2 3 4 5
  • 查找算法

    • find:在范围内查找指定值。

    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    }
  • 复制算法

    • copy:将范围内的元素复制到目标位置。

    std::vector<int> dest(5);
    std::copy(vec.begin(), vec.end(), dest.begin());
  • 其他常用算法

    • reverse:反转范围内的元素。

    • accumulate:计算范围内元素的累加和。

    • count:统计范围内某个值的出现次数。

    • max_element / min_element:查找范围内的最大值或最小值。

示例:
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {5, 3, 1, 4, 2};
    std::sort(vec.begin(), vec.end()); // 排序
    for (int x : vec) {
        std::cout << x << " "; // 输出:1 2 3 4 5
    }
    return 0;
}

4. STL 的优势

  • 泛型编程:STL 基于模板实现,可以处理任意类型的数据。

  • 高效性:STL 的容器和算法经过高度优化,性能优异。

  • 可扩展性:用户可以通过自定义迭代器和算法扩展 STL 的功能。


5. 示例代码

以下是一个综合示例,展示如何使用容器、迭代器和算法:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    // 创建一个 vector 并初始化
    std::vector<int> vec = {5, 3, 1, 4, 2};

    // 使用 sort 算法排序
    std::sort(vec.begin(), vec.end());

    // 使用迭代器遍历并输出
    std::cout << "Sorted vector: ";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 使用 find 算法查找元素
    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end()) {
        std::cout << "Element 3 found at position: " << (it - vec.begin()) << std::endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员架构笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值