黑马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返回值既是差集中最后一个元素的位置
*/


相关文章
|
11月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
285 0
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
349 0
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
316 17
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
262 2
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
290 0
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
467 0
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
555 12
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。