黑马c++ STL常用算法 笔记(6) 常用集合算法

简介: 黑马c++ STL常用算法 笔记(6) 常用集合算法

1.  set_intersection // 求两个容器的交集

2.  set_union // 求两个容器的并集

3.  set_difference // 求两个容器的差集


1.  set_intersection // 求两个容器的交集

// 常用集合算法:set_intersection
/*
功能描述:
求两个容器的交集
函数原型:
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求两个集合的交集 返回最后位置的迭代器
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
*/
#include <bits/stdc++.h>
using namespace std;
void print1(int val)
{
  cout << val << " ";
}
void test01()
{
  vector<int> v1;
  for (int i = 0; i < 5; i++)
  {
    v1.push_back(i); // 0 1 2 3 4
  }
  vector<int> v2;
  for (int i = 1; i < 6; i++)
  {
    v2.push_back(i); // 1 2 3 4 5
  }
  vector<int> v3;
  v3.resize(min(v1.size(), v2.size())); // 别忘了开辟空间!!!!!
  vector<int>::iterator it = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
  for_each(v3.begin(), v3.end(), print1); // 1 2 3 4 0 这里是错的
  cout << endl;
  for_each(v3.begin(), it, print1); // 1 2 3 4  这里是对的
}
int main()
{
  test01();
}
/*
总结:
求交集的两个集合必须是有序序列
目标容器开辟空间需要从两个容器中取小值
set_intersection返回值即是交集中最后一个元素的位置
*/


2.  set_union // 求两个容器的并集

// 常用集合算法:set_union
/*
功能描述:
求两个集合的并集
函数原型:
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求两个集合的并集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
*/
#include <bits/stdc++.h>
using namespace std;
void print1(int val)
{
  cout << val << " ";
}
void test01()
{
  vector<int> v1;
  for (int i = 0; i < 5; i++)
  {
    v1.push_back(i); // 0 1 2 3 4
  }
  vector<int> v2;
  for (int i = 1; i < 6; i++)
  {
    v2.push_back(i); // 1 2 3 4 5
  }
  vector<int> v3;
  v3.resize(v1.size() + v2.size()); // 别忘了开辟空间!!!!!
  vector<int>::iterator it = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
  // 使用函数的返回值作为end()
  for_each(v3.begin(), v3.end(), print1); // 0 1 2 3 4 5 0 0 0 0 这里是错的
  cout << endl;
  for_each(v3.begin(), it, print1); // 0 1 2 3 4 5  这里是对的
}
int main()
{
  test01();
}
/*
总结:
求并集的两个集合必须的有序序列
目标容器开辟空间需要两个容器相加
set_union返回值既是并集中最后一个元素的位置
*/


3.  set_difference // 求两个容器的差集

差集:分为v1和v2的差集(在v1不在v2),v2和v1的差集(在v2不在v1)

// 常用集合算法:set_difference
/*
功能描述:
求两个集合的差集
函数原型:
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// 求两个集合的差集
// 注意:两个集合必须是有序序列
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
*/
#include <bits/stdc++.h>
using namespace std;
void print1(int val)
{
  cout << val << " ";
}
void test01()
{
  vector<int> v1;
  for (int i = 0; i < 5; i++)
  {
    v1.push_back(i); // 0 1 2 3 4
  }
  vector<int> v2;
  for (int i = 1; i < 6; i++)
  {
    v2.push_back(i); // 1 2 3 4 5
  }
  vector<int> v3;
  v3.resize(max(v1.size(), v2.size())); // 别忘了开辟空间!!!!!
  vector<int>::iterator it = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
  // 使用函数的返回值作为end()
  for_each(v3.begin(), v3.end(), print1); // 0 0 0 0 0 0 这里是错的
  cout << endl;
  for_each(v3.begin(), it, print1); // 0 这里是对的
  cout << endl;
  cout << "------------------------" << endl;
  it = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
  // 使用函数的返回值作为end()
  for_each(v3.begin(), v3.end(), print1); // 0 0 0 0 0 0 这里是错的
  cout << endl;
  for_each(v3.begin(), it, print1); //  5  这里是对的
}
int main()
{
  test01();
}
/*
总结:
求差集的两个集合必须的有序序列
目标容器开辟空间需要从两个容器取较大值
set_difference返回值既是差集中最后一个元素的位置
*/


相关文章
|
10天前
|
搜索推荐 算法 C++
|
10天前
|
存储 算法 Serverless
|
10天前
|
存储 算法 搜索推荐
|
17天前
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
14 1
|
10天前
|
机器学习/深度学习 算法 搜索推荐
|
2天前
|
算法 数据挖掘
MATLAB数据分析、从算法到实现
MATLAB数据分析、从算法到实现
|
8天前
|
机器学习/深度学习 算法 调度
Matlab|基于改进鲸鱼优化算法的微网系统能量优化管理matlab-源码
基于改进鲸鱼优化算法的微网系统能量管理源码实现,结合LSTM预测可再生能源和负荷,优化微网运行成本与固定成本。方法应用于冷热电联供微网,结果显示经济成本平均降低4.03%,提高经济效益。代码包括数据分段、LSTM网络定义及训练,最终展示了一系列运行结果图表。
|
8天前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
14天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
10天前
|
数据采集 存储 算法
基于BP算法的SAR成像matlab仿真
**摘要:** 基于BP算法的SAR成像研究,利用MATLAB2022a进行仿真。SAR系统借助相对运动合成大孔径,提供高分辨率图像。BP算法执行回波数据预处理、像素投影及图像重建,实现精确成像。优点是高精度和强适应性,缺点是计算量大、内存需求高。代码示例展示了回波生成、数据处理到插值显示的全过程。