当前位置: 首页 > news >正文

C++ STL标准模板库详解:深入探索算法、容器与迭代器

C++的STL(Standard Template Library,即标准模板库)是C++最重要的组成部分之一,它为开发者提供了一组高效的算法和数据结构,极大地简化了代码的开发。STL主要由三大部分构成:算法、容器和迭代器。以下,我们将详细介绍STL的各个模块,帮助大家更深入理解和应用它们。


1. 算法模块

STL中的算法模块包含一组常用的算法函数,通常以函数模板的形式定义,这些函数通过参数化来适应不同的数据类型。

1.1 查找算法

在STL中,find是一个常用的查找算法,可以在容器中寻找特定的元素。

#include <algorithm>iterator find(iterator start, iterator end, const TYPE& val);
  • 功能:在 [start, end) 区间内查找 val
  • 参数
    • start:查找的起始位置(迭代器)。
    • end:查找的终止位置(迭代器,指向最后一个元素的下一个位置)。
    • val:查找的值。
  • 返回值
    • 找到时返回该元素的迭代器。
    • 否则返回 end,表示查找失败。
1.2 排序算法

sort 是STL中用于排序的算法。默认情况下,它对元素进行升序排序。

void sort(iterator start, iterator end);
void sort(iterator start, iterator end, StrictWeakOrdering cmp);
  • 功能:对 [start, end) 区间内的元素进行排序。
  • 参数
    • start:排序起始位置(迭代器)。
    • end:排序终止位置(迭代器)。
    • cmp:用于定义自定义排序规则的回调函数。

例如,若希望将数据按降序排列,可以定义一个比较函数:

bool cmp(const int& a, const int& b) {return a > b;  // 降序排列
}

然后调用 sort

sort(v.begin(), v.end(), cmp);

2. 容器模块

容器是STL的核心之一,它们提供了存储和管理数据的结构化方式。常用容器包括vectorlistdequesetmap等。下面重点介绍 vector

2.1 vector 向量容器

vector 是一种动态数组,可以在末尾添加或删除元素,并且支持通过下标随机访问。vector 底层是一个顺序结构,允许扩展大小。

构造函数

vector 支持多种构造方式:

#include <vector>// 1. 指定长度并初始化每个元素
vector( size_type num, const TYPE& val = TYPE() );// 2. 通过一组数据初始化
vector( input_iterator start, input_iterator end );
  • 参数
    • num:容器的初始大小。
    • val:初始化的默认值。
    • startend:表示数据的起始和结束迭代器。
常用运算符
  • == != <= >= < >:用于对 vector 进行整体比较。
  • []:通过下标访问元素,不会检查下标越界。越界访问会导致未定义行为。
常用成员函数

以下是 vector 的一些常用成员函数:

  1. 赋值函数

    void assign(size_type num, const TYPE& val);
    void assign(input_iterator start, input_iterator end);
    

    该函数可以让 vector 重新赋值,并自动调整大小。

  2. 访问元素

    TYPE& at(size_type loc);
    const TYPE& at(size_type loc) const;
    
    • at 函数用于安全访问元素,当 loc 越界时会抛出异常。
  3. 头尾元素

    • back():返回最后一个元素。
    • front():返回第一个元素。
  4. 迭代器相关

    iterator begin();
    iterator end();
    
    • begin 返回指向第一个元素的迭代器。
    • end 返回指向最后一个元素的下一个位置的迭代器。

    使用方法如下:

    for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << endl;
    }
    

  5. 容量相关

    • capacity():返回 vector 的当前容量。
    • size():返回 vector 中的元素个数。
  6. 修改元素数量

    • resize(size_type num, const TYPE& val = TYPE()):调整 vector 的元素数量。
    • reserve(size_type size):设置 vector 的容量。
  7. 插入与删除

    iterator insert(iterator loc, const TYPE& val);
    iterator erase(iterator loc);
    

    inserterase 函数可以在指定位置插入或删除元素。

  8. 反向迭代器

    • rbegin():指向最后一个元素的逆向迭代器。
    • rend():指向第一个元素前的逆向迭代器。

3. 迭代器模块

迭代器是访问容器中元素的工具,类似于指针。通过迭代器可以遍历容器中的元素。STL中的迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。

3.1 常见的迭代器类型
  • 输入迭代器:只用于读取容器中的元素。
  • 输出迭代器:用于向容器写入数据。
  • 前向迭代器:支持读取和写入数据。
  • 双向迭代器:支持前后移动(如 list)。
  • 随机访问迭代器:支持随机访问(如 vectordeque)。

例如,vectorbegin()end() 返回的是随机访问迭代器,因此可以直接通过 it + n 的方式来移动迭代器。


4. 常见用例示例

示例:在vector 中查找并排序元素
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> vec = {3, 1, 4, 1, 5, 9};// 查找元素auto it = find(vec.begin(), vec.end(), 4);if (it != vec.end()) {cout << "找到元素 4 的位置: " << distance(vec.begin(), it) << endl;} else {cout << "未找到元素 4" << endl;}// 对 vector 进行升序排序sort(vec.begin(), vec.end());cout << "排序后的 vector: ";for (int num : vec) {cout << num << " ";}cout << endl;return 0;
}
输出
找到元素 4 的位置: 2
排序后的 vector: 1 1 3 4 5 9

总结

STL 提供了丰富的数据结构和算法,使得 C++ 代码编写更加简洁、高效。通过合理使用 STL 中的算法、容器和迭代器,可以有效地提高代码的性能与可读性。理解并掌握 STL 是成为一名合格 C++ 开发者的关键。


http://www.mrgr.cn/news/67467.html

相关文章:

  • 基于Zynq FPGA对雷龙SD NAND的测试
  • FQDN(Fully Qualified Domain Name,完全限定域名)是指能够唯一标识互联网上一台主机的域名
  • 融合智能化和信息化的技术的智慧地产开源了。
  • Django学习-项目部署
  • 移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (9) - 编译现有的AWTK应用程序
  • JAVA WEB — HTML CSS 入门学习
  • npm 和 node 总结
  • ThreadLocal 详解——这一次彻底掌握
  • 使用CentOS宝塔面板docker搭建EasyTier内网穿透服务
  • 最新榜单!国内免费好用的OA协同软件前十名
  • 构造一个具有特定边界和向量场性质的紧致4维流形,并计算其上曲率形式的特定积分
  • ORACLE RAC用DNS服务器的配置
  • CST参数扫描设置细节
  • ChatGPT的多面手:日常办公、论文写作与深度学习的结合
  • 【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
  • HTML学习笔记十三
  • YoloV8改进策略:上采样改进:CARAFE:轻量级上采样|即插即用|附改进方法+代码
  • TOEIC 词汇专题:市场销售篇
  • (免费领源码)node.js#koa#mysql点餐系统app 84406-计算机毕设 原创
  • 详解Java操作PDF:一键生成文件,插入文字、选项、签名及公章
  • arm中内存读取延迟性能测试
  • [含文档+PPT+源码等]精品基于PHP实现的会员综合管理平台的设计与实现
  • java ssm 社团管理系统 高校社团信息平台 三个角色社长 源码 jsp
  • 对比Java和TypeScript中的服务注册和查找机制
  • 计算机体系结构之多级缓存、缓存miss及缓存hit(二)
  • 遥感数字图像处理