手把手教你学C(三十六)-c++STL 教程

目录

1. 容器(Containers)

顺序容器

示例:使用 std::vector

关联容器

示例:使用 std::map

容器适配器

示例:使用 std::queue

2. 迭代器(Iterators)

示例:使用迭代器遍历 std::vector

3. 算法(Algorithms)

示例:使用算法 std::sort

示例:使用算法 std::find

4. 函数对象(Function Objects)

示例:使用函数对象进行排序

总结


 

C++ 标准模板库(Standard Template Library,简称 STL)是一组组件化的、可复用的、高效的 C++ 类库,用于处理常见的数据结构和算法问题。STL 包括容器、迭代器、算法和函数对象四个主要组件。下面将详细介绍这些组件及其使用方法。

1. 容器(Containers)

容器是用于存储元素的数据结构。STL 中的容器包括顺序容器、关联容器和容器适配器。

顺序容器

  • std::vector:动态数组,元素连续存储,支持快速随机访问。
  • std::list:双向链表,插入和删除元素快,但随机访问慢。
  • std::deque:双端队列,两端都可以快速插入和删除元素。
  • std::forward_list:单向链表,适合快速插入和删除,但不支持随机访问。

示例:使用 std::vector

 

cpp

深色版本

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 访问元素
    std::cout << "Element at index 2: " << vec.at(2) << std::endl;

    // 添加元素
    vec.push_back(6);

    // 删除元素
    vec.erase(vec.begin() + 1);

    // 遍历容器
    for (int elem : vec) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

关联容器

  • std::set:存储唯一元素的排序容器。
  • std::multiset:存储可能重复元素的排序容器。
  • std::map:键值对容器,键必须唯一,值可以相同。
  • std::multimap:键值对容器,键可以重复。

示例:使用 std::map

 

cpp

深色版本

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> ageMap = {{"Alice", 25}, {"Bob", 30}};

    // 插入元素
    ageMap.insert({"Charlie", 35});

    // 访问元素
    auto it = ageMap.find("Bob");
    if (it != ageMap.end()) {
        std::cout << "Age of Bob: " << it->second << std::endl;
    }

    // 遍历容器
    for (const auto& pair : ageMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

容器适配器

  • std::stack:后进先出(LIFO)的容器适配器。
  • std::queue:先进先出(FIFO)的容器适配器。
  • std::priority_queue:优先队列,按照优先级顺序取出元素。

示例:使用 std::queue

 

cpp

深色版本

#include <iostream>
#include <queue>

int main() {
    std::queue<int> q;

    // 入队
    q.push(1);
    q.push(2);
    q.push(3);

    // 出队
    while (!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }
    std::cout << std::endl;

    return 0;
}

2. 迭代器(Iterators)

迭代器用于遍历容器中的元素。每个容器都有自己的迭代器类型,提供了对容器元素的访问。

示例:使用迭代器遍历 std::vector

 

cpp

深色版本

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

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

    return 0;
}

3. 算法(Algorithms)

算法是对容器中的元素进行操作的函数模板。常用的算法包括查找、排序、复制等。

示例:使用算法 std::sort

 

cpp

深色版本

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

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    // 排序
    std::sort(vec.begin(), vec.end());

    // 遍历输出
    for (int elem : vec) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

示例:使用算法 std::find

 

cpp

深色版本

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 查找元素
    auto it = std::find(vec.begin(), vec.end(), 3);
    if (it != vec.end()) {
        std::cout << "Found element: " << *it << std::endl;
    }

    return 0;
}

4. 函数对象(Function Objects)

函数对象(也称为仿函数)是可以像函数一样调用的对象。它们可以作为算法的参数传递,用于自定义比较逻辑等。

示例:使用函数对象进行排序

 

cpp

深色版本

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

struct Compare {
    bool operator()(int a, int b) {
        return a > b;
    }
};

int main() {
    std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    // 使用函数对象排序
    std::sort(vec.begin(), vec.end(), Compare());

    // 遍历输出
    for (int elem : vec) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

总结

STL 是 C++ 中一个极其强大的工具集,它提供了一系列通用的数据结构和算法,极大地提高了 C++ 开发者的生产力。通过上述示例,你可以看到如何使用 STL 中的容器、迭代器、算法和函数对象来处理常见的编程任务。掌握 STL 的使用方法,可以使你的代码更加简洁、高效和易于维护。

在实际开发中,可以根据具体需求选择合适的容器和算法,充分利用 STL 的优势。同时,也可以结合第三方库来扩展 STL 的功能,以满足更复杂的需求。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蘑菇二号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值