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.mzph.cn/diannao/59696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest插件精选:提升测试效率与质量

pytest作为Python生态系统中备受推崇的测试框架&#xff0c;以其简洁、灵活和可扩展性赢得了广泛的认可。通过合理使用pytest的各种插件&#xff0c;可以显著提升测试效率、增强测试的可读性和可维护性。 pytest-sugar&#xff1a;提升测试体验 pytest-sugar是一款增强版的py…

低代码环境中的领域与根实体解析

在现代软件开发中&#xff0c;低代码平台的兴起使得开发者能够更快速地构建应用程序。在这一过程中&#xff0c;理解领域&#xff08;Domain&#xff09;和根实体&#xff08;Root Entity&#xff09;的概念变得尤为重要。这些概念不仅帮助开发者组织和管理复杂系统中的数据和业…

Linux-c TCP服务模型

1、TCP模型&#xff0c;服务端与客户端的搭建时序图 2、TCP模型&#xff0c;在创建阶段和通信阶段&#xff0c;对套接字的理解 2.1、tcp连接阶段 2.2、tcp通信状态 一个服务端与多个客户端的通信状态 TCP与UDP的对比 &#xff08;下图是笔者理解所画&#xff0c;可能也许有错…

卡码网KamaCoder 127. 骑士的攻击

题目来源&#xff1a;127. 骑士的攻击 C题解&#xff08;来源A * 算法精讲 &#xff08;A star算法&#xff09; | 代码随想录&#xff09;&#xff1a;Astar Astar 是一种 广搜的改良版。 有的是 Astar是 dijkstra 的改良版。 其实只是场景不同而已 我们在搜索最短路的时候&…

浅谈语言模型推理框架 vLLM 0.6.0性能优化

在此前的大模型技术实践中&#xff0c;我们介绍了加速并行框架Accelerate、DeepSpeed及Megatron-LM。得益于这些框架的助力&#xff0c;大模型的分布式训练得以化繁为简。 然而&#xff0c;企业又该如何将训练完成的模型实际应用部署&#xff0c;持续优化服务吞吐性能&#xf…

软著补正有哪些类型

软著补正是指在软著申请过程中&#xff0c;版权局在审核软著申请材料时&#xff0c;发现一些部分不符合规定的内容&#xff0c;从而对申请材料提出补正要求&#xff0c;要求申请人修改或补充申请材料。软著补正通常涉及以下几种类型&#xff1a; 一、申请材料填写有误 软件名称…

闯关leetcode——3222. Find the Winning Player in Coin Game

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-winning-player-in-coin-game/description/ 内容 You are given two positive integers x and y, denoting the number of coins with values 75 and 10 respectively. Alice and Bob a…

GitLab 中文发行版最新版重点功能解读

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

大数据数据存储层MemSQL, HBase与HDFS

以下是对 MemSQL、HBase 和 HDFS 的详细介绍,这些工具在分布式数据存储和处理领域有着重要作用。 1. MemSQL MemSQL(现称为 SingleStore)是一种分布式内存数据库,兼具事务处理(OLTP)和分析处理(OLAP)的能力,专为高性能实时数据处理设计。 1.1 核心特点 内存优先存储…

斗破QT编程入门系列之二:GUI应用程序设计基础:UI文件(四星斗师)

斗破Qt目录&#xff1a; 斗破Qt编程入门系列之前言&#xff1a;认识Qt&#xff1a;Qt的获取与安装&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之一&#xff1a;认识Qt&#xff1a;初步使用&#xff08;四星斗师&#xff09; 斗破QT编程入门系列之二&#xff1a;认识…

《二分查找算法:在有序数组中搜索目标值》

目录 一、问题分析 二、二分查找算法原理 三、代码实现 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target&#xff0c;我们要写一个函数来搜索 nums 中的 target&#xff0c;如果目标值存在就返回它的下标&#xff0c;否则返回 -1。 …

【Qt】QTreeView 和 QStandardItemModel的关系

QTreeView 和 QAbstractItemModel&#xff08;通常是其子类&#xff0c;如 QStandardItemModel 或自定义模型&#xff09;是 Qt 框架中的两个关键组件&#xff0c;它们之间存在密切的关系。 关系概述 QTreeView&#xff1a; QTreeView 是一个用于显示和编辑层次数据的视图小部…

高级 HarmonyOS主题课—— 帮助快速构建各种文本识别应用的课后习题

天地不仁&#xff0c;以万物为刍狗&#xff1b; 圣人不仁&#xff0c;以百姓为刍狗。 天地之间&#xff0c;其犹橐龠乎&#xff1f; 虚而不屈&#xff0c;动而俞出。 多闻数穷&#xff0c;不若守于中。 本文内容主要来自 <HarmonyOS主题课>帮助快速构建各种文本识别应用 …

达梦数据库DM管理工具增删改不生效怎么办?如何设置事务自动提交?

前言 我在使用达梦数据库DM时&#xff0c;一开始使用的是达梦数据库自带的连接工具DM管理工具。自带的有它自己的好处&#xff0c;起码对于修改新增字段等是比较兼容的。后面我发现DBeaver也是支持连接达梦数据库的&#xff0c;所以后面用DBeaver也在连接达梦数据库。 我在一…

力扣排序455题(分发饼干)

假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。 但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i],这是能 让孩子们满足胃口的饼干的最小尺寸;并且每块饼 干j&#xff0c;都有一个尺寸 s[j]。如果 s[j]> g[i]&…

Hadoop---MapReduce(3)

MapTask工作机制 &#xff08;1&#xff09;Read阶段&#xff1a;MapTask通过InputFormat获得的RecordReader&#xff0c;从输入InputSplit中解析出一个个key/value。 &#xff08;2&#xff09;Map阶段&#xff1a;该节点主要是将解析出的key/value交给用户编写map()函数处理&…

ssm052游戏攻略网站的设计与实现+vue(论文+源码)-kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;游戏攻略网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本游戏攻略网站就是在这…

Python中的extend()方法与+操作符和list.append()方法的异同

在Python编程中&#xff0c;我们经常需要将一个列表的元素添加到另一个列表中。有几种方法可以实现这一点&#xff0c;包括extend()方法、操作符和list.append()方法。本文将详细讨论这三种方法的异同&#xff0c;帮助你更好地理解它们在实际编程中的应用。 1. extend()方法 e…

Word大珩助手:超大数字怎么读?35位数字?69位数字?

俄罗斯日前对谷歌开出了20000000000000000000000000000000000&#xff08;35位数字&#xff09;美元的罚款 这一数字远超全球GDP总和&#xff0c;消息一出很快就登上热搜。 面对这样一个庞大的数字&#xff0c;人们不禁好奇&#xff0c;这样的数字该如何读出来&#xff1f; …

VisionPro —— CogIPOneImgeTool工具详解

CogIPOneImageTool工具主要用来对单张图像进行算法处理操作 CogIPOneImgeTool简介 CogIPOneImageTool 工具可完成高斯平滑、高通滤波和图像量化等基本图像处理操作。Image Processing One Image 工具编辑控件为此工具提供图形用户界面。 Image Processing Operations (图像处…