常用集合算法

【简介】:

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

set_intersection

【功能】:

求两个容器中元素的交集

【函数原型】:

​set_intersection(iterator begin1,iterator end1,iterator begin2, iterator end3,iterator dest);​

// 求两个集合的交集

// **注意**:两个容器的元素必须是有序的

// begin1 容器1的开始迭代器

// end1 容器1的结束迭代器

// begin2 容器2的开始迭代器

// end2 容器2的结束迭代器

// dest 目标容器的起始迭代器

【demo】:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class MyPrint
{
public:
void operator()(int v)
{
cout << v << " ";
}
};

void test01()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}

vector<int> v2;
for (int i = 5; i < 15; i++)
{

v2.push_back(i);
}

// cout << "v1:";
// for_each(v1.begin(), v1.end(), MyPrint());
// cout << endl;

// cout << "将交集的元素放在 v1中后:";
// set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v1.begin());
// for_each(v1.begin(), v1.end(), MyPrint());
// cout << endl;

vector<int> vTarget;
// 取两个容器中较小容器的size(多余的空间赋予默认值0)
vTarget.resize(min(v1.size(), v2.size()));
vector<int>::iterator pos = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
// cout << *pos << endl; // 返回值是交集中最后一个元素的位置
cout << "v1和v2的交集元素为:";
for_each(vTarget.begin(), vTarget.end(), MyPrint());
cout << endl;
}
int main()
{
test01();
return 0;
}

小结

  • 求交集的两个集合必须是有序序列
  • 目标容器开辟空间,取两个容器中较小的容器的​​size​
  • ​set_intersetction​​ 返回值是交集中最后一个元素的位置

set_union

【功能】:

求两个容器中元素的并集

【函数原型】:

​set_union(iterator begin1,iterator end1,iterator begin2,iterator end2, iterator dest);​

// 求两个集合的并集

// **注意**:两个容器的元素必须是有序的

// begin1 容器1的开始迭代器

// end1 容器1的结束迭代器

// begin2 容器2的开始迭代器

// end2 容器2的结束迭代器

// dest 目标容器的起始迭代器

【demo】:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class MyPrint
{
public:
void operator()(int v)
{
cout << v << " ";
}
};

void test01()
{
vector<int> v1;
for (int i = 0; i < 5; i++)
{
v1.push_back(i);
}

vector<int> v2;
for (int i = 5; i < 10; i++)
{

v2.push_back(i);
}

vector<int> vTarget;
// 目标容器开辟空间,取两个容器size之和
vTarget.resize(v1.size() + v2.size());
set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

for_each(vTarget.begin(), vTarget.end(), MyPrint());
cout << endl;
}
int main()
{
test01();
return 0;
}

小结

  • 求并集的两个容器元素必须是有序的
  • 目标容器开辟空间,取两个容器​​size​​之和
  • ​set_union​​ 返回值是并集中最后一个元素的位置

set_difference

【功能】:

求两个容器中元素的差集

【函数原型】:

​set_difference(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);​

// 求两个集合的差集

// **注意**:两个容器的元素必须是有序的

// begin1 容器1的开始迭代器

// end1 容器1的结束迭代器

// begin2 容器2的开始迭代器

// end2 容器2的结束迭代器

// dest 目标容器的起始迭代器

【demo】:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class MyPrint
{
public:
void operator()(int v)
{
cout << v << " ";
}
};
void test01()
{
vector<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
vector<int> v2;
for (int i = 5; i < 15; i++)
{

v2.push_back(i);
}

cout << "v1与v2的差集为:";
vector<int> vTarget1;
// 目标容器开辟空间,取较大容器的size
vTarget1.resize(max(v1.size(), v2.size()));
set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget1.begin());
for_each(vTarget1.begin(), vTarget1.end(), MyPrint());
cout << endl;

cout << "v2与v1的差集为:";
vector<int> vTarget2;
// 目标容器开辟空间,取较大容器的size
vTarget2.resize(max(v1.size(), v2.size()));
set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget2.begin());
for_each(vTarget2.begin(), vTarget2.end(), MyPrint());
cout << endl;
}

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

小结

  • 求差集的两个集合必须是有序序列
  • 目标容器开辟空间,需要从两个容器中取较大容器的​​size​​值
  • ​set_difference​​返回值是差集中最后一个元素的位置