C++ 的常见算法 之二

C++ 的常见算法 之二

  • 划分序列
    • partition
    • stable_partition
  • 排序
    • sort
    • nth_element
  • 二分查找
    • binary_search

划分序列

partition

重新排列 [first,last) 范围内的元素,使得 pred 返回 true 的所有元素先于所有返回 false 的元素。迭代器返回指向第二组的第一个元素的点。

每个组内的相对顺序不一定与调用之前相同。

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;bool greater50 (int i) { return (i > 50); }
void print_val(int val) { cout << val << ' '; }
int main () {vector<int> myvector = {30, 40, 80, 12, 19, 20, 55, 72};vector<int>::iterator bound;bound = partition (myvector.begin(), myvector.end(), greater50);// print out content:cout << "greater than 50:";for (vector<int>::iterator it=myvector.begin(); it!=bound; ++it)cout << ' ' << *it;cout << '\n';cout << "less than 50:";for (vector<int>::iterator it=bound; it!=myvector.end(); ++it)cout << ' ' << *it;cout << '\n';for_each (myvector.begin(), myvector.end(), print_val);cout << endl;return 0;
}

结果屏幕输出

greater than 50: 72 55 80
less than 50: 12 19 20 40 30
72 55 80 12 19 20 40 30

stable_partition

重新排列 [first,last) 范围内的元素,pred 返回 true 的所有元素排在返回 false 的所有元素之前, 但与partition函数不同,这个函数保留每个组内元素的相对顺序。

这通常使用内部临时缓冲区来实现。

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;bool greater30 (int i) { return (i > 30); }
void print_element(int val) { cout << val << " ";}int main () {vector<int> myvector = {4, 80, 5, 30, 6, 9, 50, 60, 1, 15};vector<int>::iterator bound;bound = stable_partition (myvector.begin(), myvector.end(), greater30);// print out content:cout << "greater than 30 elements:";for (vector<int>::iterator it=myvector.begin(); it!=bound; ++it)cout << ' ' << *it;cout << '\n';cout << "greater than or equal 30 elements: ";for (vector<int>::iterator it=bound; it!=myvector.end(); ++it)cout << ' ' << *it;cout << '\n';cout << "all elements: ";for_each (myvector.begin(), myvector.end(), print_element);cout << '\n';return 0;
}

结果屏幕输出

greater than 30 elements: 80 50 60
greater than or equal 30 elements:  4 5 30 6 9 1 15
all elements: 80 50 60 4 5 30 6 9 1 15

排序

sort

将范围 [first,last) 中的元素按升序排序。
第一个版本使用operator< 来比较元素,第二个版本使用comp 来比较元素。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>using namespace std;struct personnel {string  name;int     age;
};bool myfunction (int i,int j) { return (i<j); }
void print_element(int val) { cout << val << " " ; }
void print_personnel(personnel person) { cout << person.name << " " << person.age << endl; }struct sort_class {bool operator() (personnel lf, personnel lr) { return (lf.age < lr.age);}
} sort_object;int main () {vector<int> myvector = {32,71,12,45,26,80,53,33}; vector<personnel> persons = {{"John", 30},{"Allison", 25},		  {"Sam", 29},		  {"Alice", 39},		  };// using default comparison (operator <):sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)// print out content:cout << "myvector contains:" << endl;for_each (myvector.begin(), myvector.end(), print_element);cout << '\n';// using object as compsort (persons.begin(), persons.end(), sort_object); // print out content:cout << "sorted personnel:" << endl;for_each (persons.begin(), persons.end(), print_personnel);cout << '\n';return 0;
}

结果屏幕·输出

myvector contains:
12 32 45 71 26 33 53 80
sorted personnel:
Allison 25
Sam 29
John 30
Alice 39

nth_element

重新排序 [first,last) 范围内的元素,得到的序列是,第 n 个位置的元素位置是,完全排序后,该元素所在的位置。

在结果序列中,其他元素没有任何特定的顺序,第 n 个元素前面的所有元素,都小于或对于该元素,它后面的元素都大于或等于它。

该算法有两个版本,第一个版本使用operator< 来比较元素,第二个版本使用comp来比较元素。

#include <iostream>  
#include <algorithm> 
#include <vector> using namespace std;bool myfunction (int i,int j) { return (i<j); }
void print_element(int val)  { cout << val << " "; }struct personnel {string name;int  age;
};struct personnel_comp {bool operator()(personnel lf, personnel lr) {return (lf.age < lr.age);};
} person_comp;int main () {vector<int> myvector = {1, 9, 5, 8, 90, 30, 11};vector<int> v2 = {11, 19, 15, 18, 100, 40, 21, 130, 210};vector<personnel> v_persons = {{"John", 30},{"Allison", 25},		  {"Sam", 29},		  {"Alice", 39},};// using default comparison (operator <):nth_element (myvector.begin(), myvector.begin()+5, myvector.end());cout << "before sort:";for_each (myvector.begin(), myvector.end(), [](int val) ->void {cout << val << " ";});cout << endl;// using default compnth_element (myvector.begin(), myvector.begin()+5, myvector.end());// print out content:cout << " after sort:";for_each (myvector.begin(), myvector.end(),  [](int val) ->void {cout << val << " ";});cout << '\n';// using function as compcout << "before sort:" << endl;for_each (v2.begin(), v2.end(), [](int val) ->void {cout << val << " ";});cout << endl;nth_element (v2.begin(), v2.begin()+6, v2.end(), myfunction);cout << " after sort:";for_each (v2.begin(), v2.end(),  [](int val) ->void {cout << val << " ";});cout << '\n';// using function as compcout << "before sort:" << endl;for_each (v_persons.begin(), v_persons.end(), [](personnel p) ->void {cout << p.name << " " << p.age << endl;});cout << endl;nth_element (v_persons.begin(), v_persons.begin()+3, v_persons.end(), person_comp);cout << " after sort:" << endl;for_each (v_persons.begin(), v_persons.end(),  [](personnel p) ->void {cout << p.name << " " << p.age << endl;});cout << '\n';return 0;
}

程序运行结果屏幕输出

before sort:9 1 5 8 11 30 90after sort:8 1 5 9 11 30 90
before sort:
11 19 15 18 100 40 21 130 210after sort:19 11 15 18 21 40 100 130 210
before sort:
John 30
Allison 25
Sam 29
Alice 39after sort:
Sam 29
Allison 25
John 30
Alice 39

二分查找

binary_search

如果范围 [first,last) 中的任何元素值等于 val,则返回 true,否则返回 false。

该算法支持两种版本。

  • 第一个版本,使用operator< 来比较元素,
  • 第二个版本,使用comp 来比较元素。如果 (!(a<b) && !(b<a)) 或 if (!comp(a,b) && !comp(b,a)),则 a 和 b 两个元素被视为相同。

范围中的元素应已根据相同的标准(operator< 或 comp)进行排序,或者至少根据 val 进行分区。

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;bool myfunction (int i,int j) { return (i<j); }struct personnel {string name;int  age;
};struct personnel_comp {bool operator()(personnel lf, personnel lr) {return (lf.name < lr.name);};
} person_comp;int main () {std::vector<int> v = {1,2,40,30,3,4,5,20,10}; vector<personnel> v_persons = {{"John", 30},{"Allison", 25},		  {"Sam", 29},		  {"Alice", 39},};// using default comparison:sort (v.begin(), v.end());cout << " After sort: " << endl;for_each (v.begin(), v.end(), [](int v)->void{cout << v << " ";});cout << endl;cout << "looking for a 3... ";if (binary_search (v.begin(), v.end(), 3))cout << "found!\n"; else cout << "not found.\n";// using myfunction as comp:sort (v.begin(), v.end(), myfunction);cout << "looking for a 15... ";if (binary_search (v.begin(), v.end(), 15, myfunction))cout << "found!\n"; else cout << "not found.\n";// using personnel_comp as comp:cout << " Before sort: " << endl;for_each (v_persons.begin(), v_persons.end(), [](personnel v)->void{cout << v.name << " " << v.age << endl;});sort (v_persons.begin(), v_persons.end(), person_comp);cout << " After sort: " << endl;for_each (v_persons.begin(), v_persons.end(), [](personnel v)->void{cout << v.name << " " << v.age << endl;});cout << endl;cout << "looking for John... ";personnel person = {"John", 30}; if (binary_search (v_persons.begin(), v_persons.end(), person, person_comp))cout << "found!\n"; else cout << "not found.\n";return 0;
}

上述代码运行后的屏幕输出

 After sort:
1 2 3 4 5 10 20 30 40
looking for a 3... found!
looking for a 15... not found.Before sort:
John 30
Allison 25
Sam 29
Alice 39After sort:
Alice 39
Allison 25
John 30
Sam 29looking for John... found!

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

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

相关文章

Python开发——Python 线程入门

An Intro to Threading in Python – Real Python 1. 什么是线程&#xff1f; 线程是一个独立的执行流程。这意味着您的程序将有两件事情同时发生。但对于大多数 Python 3 实现来说&#xff0c;不同的线程实际上并不是同时执行的&#xff1a;它们只是看起来是这样。 人…

Vue3中的jsx的babel配置

如果我们希望在项目中使用jsx&#xff0c;那么我们需要添加对jsx的支持&#xff1a; jsx我们通常会通过Babel来进行转换&#xff08;React编写的jsx就是通过babel转换的&#xff09;&#xff1b;对于Vue来说&#xff0c;我们只需要在Babel中配置对应的插件即可&#xff1b; *…

Vue+Xterm.js+WebSocket+JSch实现Web Shell终端

一、需求 在系统中使用Web Shell连接集群的登录节点 二、实现 前端使用Vue&#xff0c;WebSocket实现前后端通信&#xff0c;后端使用JSch ssh通讯包。 1. 前端核心代码 <template><div class"shell-container"><div id"shell"/>&l…

C++ 实现字符串逆序

C 实现字符串逆序 思路&#xff1a; 输入一个字符串。使用双指针法&#xff0c;交换字符串的首尾字符&#xff0c;逐步向中间移动。输出逆序后的字符串。 #include <iostream> #include <string>using namespace std;void reverseString(string &str) {int …

【FPGA】STA静态时序分析

文章目录 一.定义二.分类1. 静态时序分析2. 静态时序分析 三. 概念四. 时间余量1.场景2.建立时间余量3.保持时间余量 一.定义 时序分析:检查电路是否满足时序要求&#xff1b; 二.分类 1. 静态时序分析 STA,遍历所有的时序路径&#xff0c;根据时序库&#xff08;.lib文件&…

【Mojolicious RESTful接口全解】构建现代化Web服务的秘诀

标题&#xff1a;【Mojolicious RESTful接口全解】构建现代化Web服务的秘诀 Mojolicious是一个基于Perl的高性能、实时的Web框架&#xff0c;它以其简洁的语法和强大的功能而闻名。Mojolicious不仅支持传统的Web应用开发&#xff0c;还特别适合构建RESTful API。本文将详细介绍…

新手教学系列——使用uWSGI对Flask应用提速

在构建和部署Flask应用时,性能和稳定性是两个关键的因素。为了提升Flask应用的性能,我们可以借助uWSGI这个强大的工具。本文将详细介绍为什么要使用uWSGI、uWSGI的底层原理,并提供一个实例配置,帮助你更好地理解和应用这个工具。 为什么要使用uWSGI uWSGI 是一个应用服务…

探索企业知识边界,鸿翼ECM AI助手开启智慧问答新时代

在信息化迅速发展的当下&#xff0c;企业积累的数字文档数量巨大&#xff0c;这些文档中蕴含的深层信息对业务发展至关重要。然而&#xff0c;传统的搜索技术常常因只能进行关键字查询而无法满足对文档深层次理解的需求。 据Gartner调查&#xff0c;高达47%的员工在寻找有效工…

Webpack: 三种Chunk产物的打包逻辑

概述 在前文 Webpack: Dependency Graph 管理模块间依赖 中&#xff0c;我们已经详细讲解了「构建」阶段如何从 Entry 开始逐步递归读入、解析模块内容&#xff0c;并最终构建出模块依赖关系图 —— ModuleGraph 对象。本文我们继续往下&#xff0c;讲解在接下来的「封装」阶段…

【大数据】—美国交通事故分析(2016 年 2 月至 2020 年 12 月)

引言 在当今快速发展的数字时代&#xff0c;大数据已成为我们理解世界、做出决策的重要工具。特别是在交通安全领域&#xff0c;大数据分析能够揭示事故模式、识别风险因素&#xff0c;并帮助制定预防措施&#xff0c;从而挽救生命。本文将深入探讨2016年2月至2020年12月期间&…

【redis】 LRU 和 LFU 算法

1、简介 Redis 中的 LRU&#xff08;Least Recently Used&#xff09;和 LFU&#xff08;Least Frequently Used&#xff09;算法是用于决定在内存空间不足时&#xff0c;哪些键&#xff08;key&#xff09;应该被删除以释放空间的策略。这两种算法都试图通过跟踪键的使用情况…

解决Memcached内存碎片:优化缓存性能的策略

解决Memcached内存碎片&#xff1a;优化缓存性能的策略 Memcached是一个广泛使用的高性能分布式内存缓存系统&#xff0c;它通过在内存中缓存数据来加速数据检索操作。然而&#xff0c;随着时间的推移和缓存操作的进行&#xff0c;Memcached可能会遇到内存碎片问题&#xff0c…

24年河南特岗教师招聘流程+报名流程

河南特岗教师报名流程如下 1.登录河南省特岗招聘网 登录河南省特岗招聘网注册账号和密码&#xff0c;账号可以是手机号或者身份证号&#xff0c;密码自己设置 2.注册登录账号 注册完账号重新登录账号&#xff0c;输入身份证号、手机号、密码、验证码 3.浏览考试须知 填写个人信…

Python 编程快速上手——让繁琐工作自动化(第2版)读书笔记01 Python基础快速过关

Python 编程快速上手——让繁琐工作自动化&#xff08;第2版&#xff09;读书笔记01 Python基础快速过关 1 python基础概念 Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。 python运算符顺序 **——%——//——/——*——-——python中常见的数据…

Real-Time 3D Graphics with WebGL2

WebGL渲染管线 下图是WebGL渲染管线的示意图: Vertex Buffer Objects (VBOs) VBOS中包含了用于描述几何体的信息。如&#xff0c;几何体的顶点坐标&#xff0c;法线坐标&#xff0c;颜色&#xff0c;纹理坐标等。 Index Buffer Objects (IBOs) IBOs中包含了描述顶点关系的信…

C#的多线程UI窗体控件显示方案 - 开源研究系列文章

上次编写了《LUAgent服务器端工具》这个应用&#xff0c;然后里面需要新启动一个线程去对文件进行上传到FTP服务器&#xff0c;但是新线程里无法对应用主线程UI的内容进行更改&#xff0c;所以就需要在线程里设置主UI线程里控件信息的方法&#xff0c;于是就有了此博文。此文记…

Rocky Linux 9 快速安装docker 教程

前述 CentOS 7系统将于2024年06月30日停止维护服务。CentOS官方不再提供CentOS 及后续版本&#xff0c;不再支持新的软件和补丁更新。CentOS用户现有业务随时面临宕机和安全风险&#xff0c;并无法确保及时恢复。由于 CentOS Stream 相对不稳定&#xff0c;刚好在寻找平替系统…

idm 支持断点续传吗 idm 断点续传如何使用 idm断点续传怎么解决 idm下载中断后无法继续下载

断点续传功能&#xff0c;让我再也不会惧怕下载大型文件。在断点续传的帮助下&#xff0c;用户可以随时暂停下载任务&#xff0c;并在空闲时继续之前的下载进程。下载文件不惧网络波动&#xff0c;断点续传让下载过程更稳定。有关 idm 支持断点续传吗&#xff0c;idm 断点续传如…

JavaScript:if-else类型

目录 任务描述 相关知识 if语句 if-else语句 匹配问题 编程要求 任务描述 本关任务&#xff1a;根据成绩判断考试结果。 相关知识 在编程中&#xff0c;我们常常根据变量是否满足某个条件来执行不同的语句。 JavaScript中利用以if关键字开头的条件语句达到以上目的&am…