c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

news2024/11/26 16:36:12

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

文章目录

  • c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作
  • 16.3.3 对矢量可执行的其他操作
  • 程序清单16.9 vect3.cpp


16.3.3 对矢量可执行的其他操作

程序员通常要对数组执行很多操作,如搜索、排序、随机排序等。矢量模板类包含了执行这些常见的操作的方法吗?没有!STL从更广泛的角度定义了非成员(non-member)函数来执行这些操作,即不是为每个容器类定义 find()成员函数,而是定义了一个适用于所有容器类的非成员函数 find()。这种设计理念省去了大量重复的工作。例如,假设有8个容器类,需要支持10种操作。如果每个类都有自己的成员函数,则需要定义80(8*10)个成员函数。但采用STL方式时,只需要定义10个非成员函数即可。在定义新的容器类时,只要遵循正确的指导思想,则它也可以使用己有的10个非成员函数来执行查找、排序等操作。另一方面,即使有执行相同任务的非成员函数,STL有时也会定义一个成员函数。这是因为对有些操作来说,类特定算法的效率比通用算法高,因此,vector的成员函数swap()的效率比非成员函数swap()高,但非成员函数让您能够交换两个类型不同的容器的内容。
下面来看3个具有代表性的STL函数:for_each()、random_shufe()和sort()。for each()函数可用于很多容器类,它接受3个参数。前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象,函数对象将稍后介绍)。foreach()函数将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。可以用foreach()函数来代替 for 循环。例如,可以将代码:

vector<Review>::iterator pr;
for(pr=books.begin();pr !=books.end();pr++)
ShowReview(*pr);

替换为:

for each(books.begin(),books.end(),ShowReview);

这样可避免显式地使用迭代器变量。
Random shume()函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。例如,下面的语句随机排列 books 矢量中所有元素:

random_shuffle(books.begin(),books.end());

与可用于任何容器类的 for each 不同,该函数要求容器类允许随机访问,vector 类可以做到这一点。sort()函数也要求容器支持随机访问。该函数有两个版本,第一个版本接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<运算符,对区间中的元素进行操作。例如,下面的语句按升序对coolstuf的内容进行排序,排序时使用内置的<运算符对值进行比较:

vector<int>coolstuff;
sort(coolstuff.begin(),coolstuff.end());

如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的 operator<()函数例如,如果为 Review提供了成员或非成员函数operator<(),则可以对包含 Review 对象的矢量进行排序。由于Review是一个结构,因此其成员是公有的,这样的非成员函数将为:

bool operator<(const Review&rl,const Review&r2)
if(rl.title <r2.title)return true:
else if(rl.title == r2.title && rl.rating < r2.rating)
return true;
else
return false;

有了这样的函数后,就可以对包含Review对象(如books)的矢量进行排序了:

sort(books.begin(),books.end());

注意,与 operator<()相比,WorseThan()函数执行的对 Review 对象进行排序的工作不那么完整。如果两个对象的 title 成员相同,operator<()函数将按rating进行排序,而 WorseThan()将它们视为相同。第一种排序称为全排序(total ordering),第二种排序称为完整弱排序(strictweak ordering)。在全排序中,如果a<b和 b<a 都不成立,则a和b必定相同。在完整弱排序中,情况就不是这样了。它们可能相同,也可能只是在某方面相同,如 WorseThan()示例中的rating 成员。所以在完整弱排序中,只能说它们等价,而不是相同。
程序清单16.9演示了这些STL 函数的用法。

程序清单16.9 vect3.cpp

// vect3.cpp -- using STL functions
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

struct Review {
    std::string title;
    int rating;
};

bool operator<(const Review & r1, const Review & r2);
bool worseThan(const Review & r1, const Review & r2);
bool FillReview(Review & rr);
void ShowReview(const Review & rr);
int main()
{
    using namespace std;

    vector<Review> books;
    Review temp;
    while (FillReview(temp))
        books.push_back(temp);
    if (books.size() > 0)
    {
        cout << "Thank you. You entered the following "
             << books.size() << " ratings:\n"
              << "Rating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);

        sort(books.begin(), books.end());
        cout << "Sorted by title:\nRating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);

        sort(books.begin(), books.end(), worseThan);
        cout << "Sorted by rating:\nRating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);

        random_shuffle(books.begin(), books.end());
        cout << "After shuffling:\nRating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);
    }
    else
        cout << "No entries. ";
    cout << "Bye.\n";
    // cin.get();
    return 0;
}

bool operator<(const Review & r1, const Review & r2)
{
    if (r1.title < r2.title)
        return true;
    else if (r1.title == r2.title && r1.rating < r2.rating)
        return true;
    else
        return false;
}

bool worseThan(const Review & r1, const Review & r2)
{
    if (r1.rating < r2.rating)
        return true;
    else
        return false;
}

bool FillReview(Review & rr)
{
    std::cout << "Enter book title (quit to quit): ";
    std::getline(std::cin,rr.title);
    if (rr.title == "quit")
        return false;
    std::cout << "Enter book rating: ";
    std::cin >> rr.rating;
    if (!std::cin)
        return false;
    // get rid of rest of input line
    while (std::cin.get() != '\n')
        continue;
    return true;
}

void ShowReview(const Review & rr)
{
    std::cout << rr.rating << "\t" << rr.title << std::endl; 
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941277.html

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

相关文章

Idea中git如何进行回退操作

当你的代码已经提交并且推送到远程仓库了如何进行回退 1.首先找到你需要回退到的提交记录 假设你要回退到当前大营销模板位置&#xff0c;右键当前分支然后选中rest 点击后&#xff0c;若需要保留之前提交记录到本地则可以选择max或者soft 选择后进行回退操作&#xff0c;最后将…

全代码 | 随机森林在回归分析中的经典应用

公众号后台记录了发表过文章的各项阅读指标包括&#xff1a;内容标题&#xff0c;总阅读人数&#xff0c;总阅读次数&#xff0c;总分享人数&#xff0c;总分享次数&#xff0c;阅读后关注人数&#xff0c;送达阅读率&#xff0c;分享产生阅读次数&#xff0c;首次分享率&#…

《低代码指南》——Oracle APEX : AI在低代码开发中的创新应用

在低代码开发领域,我们正在目睹人工智能(AI)集成所带来的显著进展。Oracle公司最新推出的APEX 24.1版本,便是这一趋势的明显体现,其集成的AI功能旨在极大提高开发者的生产力,同时简化应用程序的创建过程。 Contents 将变革性的AI整合到低代码平台 将AI技术引入低代码平台…

UniMERNet - 数学公式识别转LaTeX

文章目录 一、关于 UniMERNet演示视频 二、快速入门1、克隆repo并下载模型2、安装3、运行UniMERNet 四、评估1、下载UniMER-Test数据集2、运行评估代码3、与SOTA方法的性能比较&#xff08;BLEU&#xff09;4、不同方法的可视化结果 五、UniMER数据集1、导言2、数据集下载 六、…

【Linux 13】文件系统

文章目录 &#x1f308; 一、前言&#x1f308; 二、文件操作的系统接口⭐ 1. 打开文件 open⭐ 2. 关闭文件 close⭐ 3. 写入文件 write⭐ 4. 读取文件 read &#x1f308; 三、文件描述符⭐ 1. 文件描述符介绍⭐ 2. 提前被分配的文件描述符 0 1 2⭐ 3. 文件描述符的分配规则 &…

【Qt】Qt的坐标转换(mapToGlobal)

1、QPoint QWidget::mapToGlobal(const QPoint &pos) const 将小部件坐标转换为全局坐标。mapToGlobal(QPoint(0,0))可以得到小部件左上角像素的全局坐标。2、QPoint QWidget::mapToParent(const QPoint &pos) const 将小部件坐标转换为父部件坐标。如果小部件没有父部…

Linux内存的概念及管理

1、内存概念 内存是指计算机中所安装的随机存取内存的容量&#xff0c;储存是指计算机内硬盘的容量。硬盘应当是计算机的“外存”。内存应当是在主板上的一些存储器&#xff0c;用来保存CPU运算使用过程中的中间数据和计算结果&#xff0c;当不用这些数据时&#xff0c;它们被保…

鸿蒙仓颉语言【Redis仓颉语言客户端】

特性 支持RESP2和RESP3协议接口设计兼容jedis接口语义丰富的管理命令支持支持单连接多线程模式支持发布订阅模式支持哨兵模式和集群模式完备的单元测试覆盖架构简洁&#xff0c;易于扩展 开发计划 2024.3.22 完成支持单机模式的RESP2和RESP3协议的客户端&#xff0c;提供Bet…

实际生活中网段不通的典型分析及处理方案

关于端口&#xff1a; 应用层&#xff1a; FTP TELNET SMTP DNS TFTP SNMP 端口号&#xff1a; 21 23 25 53 69 161 传输层&#xff1a; TCP UDP&#xff08;DNS两个都占…

7月21日,贪心练习

大家好呀&#xff0c;今天带来一些贪心算法的应用解题、 一&#xff0c;柠檬水找零 . - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 本题的贪心体现在对于20美元的处理上&#xff0c;我们总是优先把功能较少的10元作为找零&#xff0c;这样可以让5元用处更大 …

野兔在线工具箱系统全新升级改版,基于TP8和yetuadmin后台实现

野兔在线工具箱系统全新升级改版&#xff0c;基于TP8和yetuadmin后台实现 系统名称&#xff1a;野兔在线工具系统 系统语言&#xff1a;支持多语言&#xff0c;大概有20种 系统源码&#xff1a;不加密&#xff0c;开源 系统开发&#xff1a;PHPMySQL (基于thinkphp8&#x…

重发布路由策略实验

实验要求 1.搭建拓扑 路由策略分析&#xff1a; 拓扑左边是rip协议&#xff0c;右边是ospf协议&#xff0c;想要实现全网可达可以采用多点双向重发布的方式。 对于rip协议使用偏移列表来干涉选路&#xff0c;对于ospf协议采用路由策略来干涉选路 2.配置ip r1 [AR1]interfac…

【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

什么是机器学习以及机器学习如今的社会现状!!

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

长效代理IP如何选用及代理服务分析

在这个数据为王、信息瞬息万变的时代&#xff0c;长效代理IP成为了众多开发者、数据科学家乃至普通网民手中的一把利器。它不仅能帮助我们解决地域管理&#xff0c;还能在保护隐私的同时&#xff0c;确保数据传输的稳定与安全。但面对市面上琳琅满目的代理服务&#xff0c;如何…

飞腾腾云S2500 Nginx单机环回测试性能调优方法

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

Vulnhub靶场DC-7练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. 获取用户名/密码2. ssh连接目标主机3. drush命令修改Drupal密码 0x03 漏洞查找与利用1. Drupal写入php木马2. 连接shell3. 反弹shell并提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-…

深度学习每周学习总结N4:中文文本分类-Pytorch实现(基本分类(熟悉流程)、textCNN分类(通用模型)、Bert分类(模型进阶))

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结&#xff1a;1. 基础模型a. 数据加载b. 数据预处理c. 模型搭建与初始化d. 训练函数e. 评估函数f.拆分数据集运行模型g. 结果可…

git命令学习分享

分布式版本控制系统&#xff0c;本地仓库和远程仓库相互独立。 使用repository仓库进行控制&#xff0c;可以对里面的文件进行跟踪&#xff0c;复原。 git config --global --list&#xff1a;查看git配置列表 cd ** &#xff1a;进入** cd .. &#xff1a;退回上一级 echo…

【人工智能】Transformers之Pipeline(四):零样本音频分类(zero-shot-audio-classification)

​​​​​​​ 目录 一、引言 二、零样本音频分类&#xff08;zero-shot-audio-classification&#xff09; 2.1 概述 2.2 意义 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数​​​​​​​ 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模…