首页 > 编程语言 >常用集合算法

常用集合算法

时间:2024-04-10 21:30:36浏览次数:23  
标签:容器 常用 set 迭代 iterator v1 算法 集合 include

算法简介:

set_intersection // 求两个容器的交集
set_union // 求两个容器的并集
set_difference // 求两个容器的差集

一、set_intersection:求两个容器的交集

函数原型:

set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2,
iterator dest);
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器

注意:两个集合必须是有序序列

代码示例:

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
#include<algorithm>

//常用集合算法	set_intersection

void myPrint(int val)
{
	cout << val << " ";
}
void test()
{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);//0~9
		v2.push_back(i + 5);//5~14
	}

	vector<int>vTarget;
	//目标容器需要提前开辟空间
	//最特殊情况 大容器包括小容器	开辟空间 取小容器的size即可vTarget.resize((v1.size()<v2.size()) ? v1.size():v2.size());//三目运算符
	vTarget.resize(min(v1.size(), v2.size()));

	//获取交集
	vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

	for_each(vTarget.begin(), itEnd, myPrint);
	cout << endl;
}

int main()
{
	test();
	return 0;
}

总结:

求交集的两个集合必须的有序序列

目标容器开辟空间需要从两个容器中取小值

set_intersection返回值是交集中最后一个元素的位置

二、set_union:求两个集合的并集

函数原型:

set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator
dest);
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器

注意:两个集合必须是有序序列

代码示例:

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
#include<algorithm>

//常用集合算法	set_intersection

void myPrint(int val)
{
	cout << val << " ";
}
void test()
{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}

	vector<int>vTarget;
	//目标容器需要提前开辟空间
	//最特殊情况 两个容器没有交集,并集就是两个容器相加
	vTarget.resize(v1.size() + v2.size());

	vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
	for_each(vTarget.begin(), itEnd, myPrint);
	cout << endl;
}

int main()
{
	test();
	return 0;
}

总结:

求并集的两个集合必须的有序序列

目标容器开辟空间需要两个容器相加

set_union返回值既是并集中最后一个元素的位置

三、set_difference:求两个集合的差集

函数原型:

set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2,
iterator dest);
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器

注意:两个集合必须是有序序列

代码示例:

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>
#include<algorithm>

//常用集合算法	set_difference
void myPrint(int val)
{
	cout << val << " ";
}
void test90()
{
	vector<int>v1;
	vector<int>v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}

	//创建目标容器
	vector<int>vTarget;
	//给目标容器开辟空间
	//最特殊情况 两个容器没有交集,取两个容器中大的size作为目标容器开辟空间
	vTarget.resize(max(v1.size(), v2.size()));

	cout << "v1和v2的差集为:" << endl;
	vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
	for_each(vTarget.begin(), itEnd, myPrint);
	cout << endl;

	cout << "--------------------" << endl;

	cout << "v2和v1的差集为:" << endl;
	itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
	for_each(vTarget.begin(), itEnd, myPrint);
	cout << endl;
}

int main()
{
	test();
	return 0;
}

总结:

求差集的两个集合必须的有序序列

目标容器开辟空间需要从两个容器取较大值

set_difference返回值既是差集中最后一个元素的位置

标签:容器,常用,set,迭代,iterator,v1,算法,集合,include
From: https://blog.csdn.net/qq_51647149/article/details/137480106

相关文章

  • java中常用的API-Runtime
    Runtime表示当前虚拟机的运行环境Runtime类是Java运行时的表示。每个Java应用程序都有一个与之关联的Runtime实例,它允许应用程序与其运行的环境进行交互。你可以使用Runtime类来获取关于JVM(Java虚拟机)的信息,以及执行一些特定的运行时操作 使用 Runtime 类来获取和打......
  • acwing算法全总结——搜索与图论
    acwing算法全总结——搜索与图论dfsbfs树与图的深度优先遍历树与图的广度优先遍历拓扑排序最短路问题dijkstra最短路bellman-ford最短路spfa最短路floyd最短路最小生成树prim最小生成树kruskal最小生成树二分图搜索与图论这一章算是对数据结构与算法的进阶提升吧,它......
  • 常用数据结构
    程序=数据结构+算法,数据结构是程序的骨架,而算法则是程序的灵魂常用的数据结构数组(Array):是一种线性数据结构,由相同类型的元素组成,可以通过索引访问元素。链表(LinkedList):是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。栈(Stack):是一种后进先出(LIFO)的数......
  • 【多UAV航迹规划】基于ACO蚁群优化的多UAV航迹规划算法matlab仿真
    目录1.算法仿真效果2.MATLAB源码3.算法概述3.1ACO蚁群优化算法原理......
  • 基于PSO的NARMAX模型参数辨识算法matlab仿真
    目录1.算法仿真效果2.MATLAB源码3.算法概述4.部分参考文献1.算法仿真效果matlab2022a仿真结果如下:......
  • 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss
    往期回顾【QT入门】Qt自定义控件与样式设计之qss介绍(Qtstylesheet)-CSDN博客【QT入门】Qt自定义控件与样式设计之qss选择器-CSDN博客【QT入门】Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss这里我......
  • xshell常用命令 以及文件属性类型
      xshell常用命令1tree/home/树状形式显示yuminstalltree2cat:查看文本内容cat>>test2.txt<<EOF>ads>adf>EOF3less,more:文本查看,分页less/etc/services4head-n1/etc/services:查看该文件第一行5psaux|head-n5:查看前5......
  • python基础-数据类型、字典、集合、文件操作(打开、关闭、读写、追加等)
    前言!!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失。观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:​​2022Python的web开发(完整版)入门全套教程,零基础入门到项目实战​数据结构数据类型字符串列表元组集合字典整型布尔None浮点型字节类......
  • java基础语法(16)| 集合
    前言Hello,大家好!很开心与你们在这里相遇,我是一个喜欢文字、喜欢有趣的灵魂、喜欢探索一切有趣事物的女孩,想与你们共同学习、探索关于IT的相关知识,希望我们可以一路陪伴~1.集合概述什么是集合集合:集合是java中提供的一种容器,可以用来存储多个数据,并且可以存储任意类型......
  • 某狗网歌曲接口逆向之加密算法刨析
    逆向网址aHR0cHM6Ly93d3cua3Vnb3UuY29t逆向链接aHR0cHM6Ly93d3cua3Vnb3UuY29tL21peHNvbmcvN2dxcGVzNjguaHRtbA== 逆向接口aHR0cHM6Ly93d3dhcGkua3Vnb3UuY29tL3BsYXkvc29uZ2luZm8= 逆向过程 请求方式:GET逆向参数        signature:1898d8f157837fa......