algorithm算法库学习之——修改序列的操作2

news2024/9/20 16:32:55

algorithm此头文件是算法库的一部分。本篇介绍修改序列的操作函数。(2)

修改序列的操作

fill

将一个给定值复制赋值给一个范围内的每个元素
(函数模板)

fill_n

将一个给定值复制赋值给一个范围内的 N 个元素
(函数模板)

generate

将相继的函数调用结果赋值给一个范围中的每个元素
(函数模板)

generate_n

将相继的函数调用结果赋值给一个范围中的 N 个元素
(函数模板)

removeremove_if

移除满足特定判别标准的元素
(函数模板)

remove_copyremove_copy_if

复制一个范围的元素,忽略满足特定判别标准的元素
(函数模板)

reverse

逆转范围中的元素顺序
(函数模板)

reverse_copy

创建一个范围的逆向副本
(函数模板)

rotate

旋转范围中的元素顺序
(函数模板)

rotate_copy

复制并旋转元素范围
(函数模板)

random_shuffleshuffle

(C++17 前)(C++11)

随机重排范围中的元素
(函数模板)

sample

(C++17)

从一个序列中随机选择 N 个元素
(函数模板)

unique

移除范围内的连续重复元素
(函数模板)

unique_copy

创建某范围的不含连续重复元素的副本
(函数模板)

示例代码:

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <utility>      // std::pair
#include <vector>
#include <array>
#include <cctype>       // std::tolower
#include <string>
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand
#include <random>       // std::default_random_engine
#include <chrono>       // std::chrono::system_clock

// function generator:
int RandomNumber() { return (std::rand() % 100); }

// class generator:
struct c_unique {
	int current;
	c_unique() { current = 0; }
	int operator()() { return ++current; }
} UniqueNumber;

int current = 0;
int UniqueNumber2() { return ++current; }

bool IsOdd4(int i) { return ((i % 2) == 1); }

bool myfunction9(int i, int j) {
	return (i == j);
}

int myrandom(int i) { return std::rand() % i; }

int main()
{
	// fill algorithm example
	std::vector<int> myvector(8);                       // myvector: 0 0 0 0 0 0 0 0
	std::fill(myvector.begin(), myvector.begin() + 4, 5);   // myvector: 5 5 5 5 0 0 0 0
	std::fill(myvector.begin() + 3, myvector.end() - 2, 8);   // myvector: 5 5 5 8 8 8 0 0
	std::cout << "myvector contains:";
	for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	// fill_n example
	std::vector<int> myvector2(8, 10);        // myvector2: 10 10 10 10 10 10 10 10
	std::fill_n(myvector2.begin(), 4, 20);     // myvector2: 20 20 20 20 10 10 10 10
	std::fill_n(myvector2.begin() + 3, 3, 33);   // myvector2: 20 20 20 33 33 33 10 10
	std::cout << "myvector2 contains:";
	for (std::vector<int>::iterator it = myvector2.begin(); it != myvector2.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	// generate algorithm example
	std::srand(unsigned(std::time(0)));
	std::vector<int> myvector3(8);
	std::generate(myvector3.begin(), myvector3.end(), RandomNumber);
	std::cout << "myvector3 contains:";
	for (std::vector<int>::iterator it = myvector3.begin(); it != myvector3.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';
	std::generate(myvector3.begin(), myvector3.end(), UniqueNumber);
	std::cout << "myvector3 contains:";
	for (std::vector<int>::iterator it = myvector3.begin(); it != myvector3.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//generate_n  example
	int myarray[9];
	std::generate_n(myarray, 9, UniqueNumber2);
	std::cout << "myarray contains:";
	for (int i = 0; i < 9; ++i)
		std::cout << ' ' << myarray[i];
	std::cout << '\n';

	//remove  example
	int myints[] = { 10,20,30,30,20,10,10,20 };      // 10 20 30 30 20 10 10 20
	// bounds of range:
	int* pbegin = myints;                          // ^
	int* pend = myints + sizeof(myints) / sizeof(int); // ^                       ^
	pend = std::remove(pbegin, pend, 20);         // 10 30 30 10 10 ?  ?  ?
												  // ^              ^
	std::cout << "range contains:";
	for (int* p = pbegin; p != pend; ++p)
		std::cout << ' ' << *p;
	std::cout << '\n';

	//remove_if  example
	int myints5[] = { 1,2,3,4,5,6,7,8,9 };            // 1 2 3 4 5 6 7 8 9
	// bounds of range:
	int* pbegin5 = myints5;                          // ^
	int* pend5 = myints5 + sizeof(myints5) / sizeof(int); // ^                 ^
	pend5 = std::remove_if(pbegin5, pend5, IsOdd4);   // 2 4 6 8 ? ? ? ? ?
												   // ^       ^
	std::cout << "the range contains:";
	for (int* p = pbegin5; p != pend5; ++p)
		std::cout << ' ' << *p;
	std::cout << '\n';

	//remove_copy  example
	int myints6[] = { 10,20,30,30,20,10,10,20 };               // 10 20 30 30 20 10 10 20
	std::vector<int> myvector6(8);
	std::remove_copy(myints6, myints6 + 8, myvector6.begin(), 20); // 10 30 30 10 10 0 0 0
	std::cout << "myvector6 contains:";
	for (std::vector<int>::iterator it = myvector6.begin(); it != myvector6.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//remove_copy_if  example
	int myints7[] = { 1,2,3,4,5,6,7,8,9 };
	std::vector<int> myvector7(9);
	std::remove_copy_if(myints7, myints7 + 9, myvector7.begin(), IsOdd4);
	std::cout << "myvector7 contains:";
	for (std::vector<int>::iterator it = myvector7.begin(); it != myvector7.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//unique  example
	int myints8[] = { 10,20,20,20,30,30,20,20,10 };           // 10 20 20 20 30 30 20 20 10
	std::vector<int> myvector8(myints8, myints8 + 9);
	// using default comparison:
	std::vector<int>::iterator it8;
	it8 = std::unique(myvector8.begin(), myvector8.end());   // 10 20 30 20 10 ?  ?  ?  ?
														   //                ^
	myvector8.resize(std::distance(myvector8.begin(), it8)); // 10 20 30 20 10
	// using predicate comparison:
	std::unique(myvector8.begin(), myvector8.end(), myfunction9);   // (no changes)
	// print out content:
	std::cout << "myvector8 contains:";
	for (it8 = myvector8.begin(); it8 != myvector8.end(); ++it8)
		std::cout << ' ' << *it8;
	std::cout << '\n';

	//unique_copy  example
	int myints9[] = { 10,20,20,20,30,30,20,20,10 };
	std::vector<int> myvector9(9);                            // 0  0  0  0  0  0  0  0  0
	// using default comparison:
	std::vector<int>::iterator it9;
	it9 = std::unique_copy(myints9, myints9 + 9, myvector9.begin());   // 10 20 30 20 10 0  0  0  0
															  //                ^
	std::sort(myvector9.begin(), it9);                          // 10 10 20 20 30 0  0  0  0
															  //                ^
	// using predicate comparison:
	it9 = std::unique_copy(myvector9.begin(), it9, myvector9.begin(), myfunction9);
	// 10 20 30 20 30 0  0  0  0
	//          ^
	myvector9.resize(std::distance(myvector9.begin(), it9));    // 10 20 30
	// print out content:
	std::cout << "myvector9 contains:";
	for (it9 = myvector9.begin(); it9 != myvector9.end(); ++it9)
		std::cout << ' ' << *it9;
	std::cout << '\n';

	//reverse  example
	std::vector<int> myvector10;
	// set some values:
	for (int i = 1; i < 10; ++i) myvector10.push_back(i);   // 1 2 3 4 5 6 7 8 9
	std::reverse(myvector10.begin(), myvector10.end());    // 9 8 7 6 5 4 3 2 1
	// print out content:
	std::cout << "myvector10 contains:";
	for (std::vector<int>::iterator it = myvector10.begin(); it != myvector10.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//reverse_copy  example
	int myints11[] = { 1,2,3,4,5,6,7,8,9 };
	std::vector<int> myvector11;
	myvector11.resize(9);    // allocate space
	std::reverse_copy(myints11, myints11 + 9, myvector11.begin());
	// print out content:
	std::cout << "myvector11 contains:";
	for (std::vector<int>::iterator it = myvector11.begin(); it != myvector11.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//rotate  example
	std::vector<int> myvector12;
	// set some values:
	for (int i = 1; i < 10; ++i) myvector12.push_back(i); // 1 2 3 4 5 6 7 8 9
	std::rotate(myvector12.begin(), myvector12.begin() + 3, myvector12.end());
	// 4 5 6 7 8 9 1 2 3
	// print out content:
	std::cout << "myvector12 contains:";
	for (std::vector<int>::iterator it = myvector12.begin(); it != myvector12.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//rotate_copy  example
	int myints13[] = { 10,20,30,40,50,60,70 };
	std::vector<int> myvector13(7);
	std::rotate_copy(myints13, myints13 + 3, myints13 + 7, myvector13.begin());
	// print out content:
	std::cout << "myvector13 contains:";
	for (std::vector<int>::iterator it = myvector13.begin(); it != myvector13.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//random_shuffle  example
	std::srand(unsigned(std::time(0)));
	std::vector<int> myvector14;
	// set some values:
	for (int i = 1; i < 10; ++i) myvector14.push_back(i); // 1 2 3 4 5 6 7 8 9
	// using built-in random generator:
	std::random_shuffle(myvector14.begin(), myvector14.end());
	// using myrandom:
	std::random_shuffle(myvector14.begin(), myvector14.end(), myrandom);
	// print out content:
	std::cout << "myvector14 contains:";
	for (std::vector<int>::iterator it = myvector14.begin(); it != myvector14.end(); ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	//shuffle
	std::array<int, 5> foo15{ 1,2,3,4,5 };
	// obtain a time-based seed:
	unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
	shuffle(foo15.begin(), foo15.end(), std::default_random_engine(seed));
	std::cout << "shuffled elements:";
	for (int& x : foo15) std::cout << ' ' << x;
	std::cout << '\n';

	std::cout << "hello world\n";
	return 0;
}

运行结果:

 参考:

https://cplusplus.com/reference/algorithm/

标准库标头 <algorithm> - cppreference.com

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

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

相关文章

Debezium日常分享系列之:Debezium UI 的状态

Debezium日常分享系列之&#xff1a;Debezium UI 的状态 一、下一阶段工作二、设计新的UI三、目前阶段四、更多内容 虽然Debezium的UI是我们愿景的重要组成部分&#xff0c;但开发与Kafka Connect紧密绑定的UI并不是正确的方向。因此&#xff0c;决定冻结当前Web UI项目的开发。…

红酒与高尔夫:球场上的优雅选择

在绿茵茵的高尔夫球场上&#xff0c;每一次挥杆都充满了力量与优雅。而当这优雅的运动与洒派红酒&#xff08;Bold & Generous&#xff09;的醇厚邂逅&#xff0c;一场视觉与感官的盛宴便悄然上演。今天&#xff0c;就让我们一起走进这个充满魅力的世界&#xff0c;感受红酒…

【动态规划】1、不同路径II+2、三角形最小路径和

1、不同路径II&#xff08;难度中等&#xff09; 该题对应力扣网址 AC代码 只会写简单的if-else class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {//1、定义子问题//2、子问题递推关系//3、确定dp数组的计算顺序…

快速入手mybits(xml配置文件版本)

目录 Blue的留声机 1、快速入手 第一步&#xff1a;导依赖 第二步&#xff1a;配置mybits-config.xml文件 第三步&#xff1a;编写sql映射文件BlogMapper.xml 第四步&#xff1a;编写运行文件&#xff0c;执行sql 2、Mapper代理开发&#xff08;企业中最常用&#xff09;…

GraphRAG

GraphRAG 与基线 RAG RAG 检索增强生成 &#xff08;RAG&#xff09; 是一种使用真实世界信息改进 LLM 输出的技术。这种技术是大多数基于 LLM 的工具的重要组成部分&#xff0c;大多数 RAG 方法使用向量相似性作为搜索技术&#xff0c;我们称之为基线 RAG。 RAG 技术在帮助 …

立即升级你的前端技能!跟随这份Vue3项目搭建教程,从零基础到专业,一步步掌握最新Web开发技术,打造响应快速、界面优雅的现代网站。

全能开发套餐&#xff0c;轻松打造现代网站&#xff01;Vue3携手Vite带来开发新体验&#xff0c;结合Axios、Pinia、Element Plus实现功能与美观并重&#xff0c;TailwindCSS与DaisyUI提供设计灵活性&#xff0c;Router 4处理页面导航。从前端到后端&#xff0c;一站式解决&…

必看!全网最详细的仓库管理办法!

如今仓库管理的优劣直接影响着企业的运营效率和成本控制。一个高效、有序的仓库能够确保货物的及时供应&#xff0c;减少库存积压&#xff0c;提高客户满意度&#xff1b;而一个混乱、无序的仓库则可能导致货物丢失、损坏&#xff0c;延误交货&#xff0c;甚至影响企业的声誉和…

【宠粉赠书】Python数据可视化:科技图表绘制

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据可视化学习的必备书籍——《Python数据可视化&#xff1a;科技图表绘制》。下面我会详细给大家介绍这本书&#xff0c;文末留有领取方式。 图书介绍 《Python数据可视化&#xff1a;科技图表绘制》结合编者多年的数…

顶象文字点选模型识别

注意&#xff0c;本文只提供学习的思路&#xff0c;严禁违反法律以及破坏信息系统等行为&#xff0c;本文只提供思路 如有侵犯&#xff0c;请联系作者下架 文字点选如何训练&#xff0c;之前的文章说了很多遍了&#xff0c;这里只放现成的模型供查看&#xff0c;有需要成品联系…

datax做增量导入数据到hive:mysql>hive

为什么要做增量导入? 例如mysql表中的数据导入hive&#xff0c;如果第一天抽取了mysql中t_user表中的全部数据&#xff0c;则第二天只需要抽取新增数据即可&#xff01; 增加导入是利用where 条件查询实现的&#xff0c;查询条件一般是自增的id或者时间列 下面演示基于时间列的…

sns.regplot()用法

概念 seaborn.regplot&#xff08;&#xff09;函数可以在两个变量之间绘制一个线性回归模型&#xff0c;可以输出线性回归线以及数据的散点图。 参数解释 seaborn.regplot(dataNone, xNone, yNone, x_estimatorNone, x_binsNone, x_cici, scatterTrue, fit_regTrue, ci95, …

s7_200smart采集遇到的问题

对s7_200smart(plc设备不太熟悉)第一次使用了modbus协议来采集数据是采集不到bcd码类型的数据&#xff0c;modbus里面不支持这个数据类型。采用西门子类型来设置采集数据也遇到不少问题&#xff1f; 第一&#xff1a;采集速率不可以太高&#xff0c;最好1秒一次&#xff0c;通…

YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

我们终究会懂得自己并非无所不能

今天参加“全民健身日”公开水域游泳比赛&#xff0c;第一次在游泳上有一种无力感。 以前以为自己游泳怎么都不会累&#xff0c;大不了踩踩水&#xff0c;或者在水上漂着。今天竟然途中可耻地抱着“跟屁虫”休息了。 是不是承认自己的无能&#xff0c;也是一种进步&#xff1f;…

【简历】苏州某大学211硕士:25届Java简历指导通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届211硕士同学的Java简历&#xff0c;这个学历他的目标必然是冲大厂。 不过他的简历几乎没什么提问点&#xff0c;211在大厂…

1.2 C 语言环境:MinGW 与 CLion 的安装与配置

目录 1 C 语言的由来 2 安装 MinGW 编译器 3 Windows 中安装 CLion 开发环境 3.1 安装 CLion 开发环境 3.2 运行试用 30 天 3.3 新建项目​ 3.4 汉化 4 Mac 中安装 Clion 开发环境 4.1 安装 CLion 开发环境 4.2 运行试用 30 天 4.3 新建项目 ​4.4 汉化 5 向日葵的…

【Linux】系列入门摘抄笔记-6-tar打包压缩和vim编辑器

打包、压缩和解压命令 压缩文件一定要严格区分扩展名 tar 打包程序 tar [主选项+辅选项] [包名] [目标文件或目录]描述:tar命令是Linux下最常用的打包程序。使用tar命令打出来的包称为tar包,因为tar包文件的后缀通常是“.tar”。 每条tar命令只能有一个主选项,而辅助选项…

C语言实现-排序1

文章目录 &#x1f3af;引言&#x1f453;排序1.排序的概念以及运用1.1概念1.2运用1.3常见的排序算法 2.排序算法的实现2.1插入排序2.1.1直接插入排序2.1.2希尔排序 2.2选择排序2.2.1直接选择排序2.2.2堆排序 &#x1f947;结语 &#x1f3af;引言 欢迎来到HanLop博客的C语言数…

C#如何对某个词在字符串中出现的次数进⾏计数(LINQ)

文章目录 基础知识实现方法基础计数LINQ优化处理标点符号总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#和VB.NET中强大的查询语言&#xff0c;它可以用来查询集合、SQL数据库、XML文档等。在C#中&#xff0c;我们可以使用LINQ来简化对字符串中特定单词出现次…

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…