1. 程式人生 > 實用技巧 >STL—常用集合演算法

STL—常用集合演算法

常用集合演算法

學習目標:

  • 掌握常用的集合演算法

演算法簡介:

  • set_intersection // 求兩個容器的交集

  • set_union // 求兩個容器的並集

  • set_difference // 求兩個容器的差集

1 set_intersection

功能描述:

  • 求兩個容器的交集

函式原型:

  • set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

    // 求兩個集合的交集

    // 注意:兩個集合必須是有序序列

    // beg1 容器1開始迭代器
    // end1 容器1結束迭代器
    // beg2 容器2開始迭代器
    // end2 容器2結束迭代器
    // dest 目標容器開始迭代器

示例:

#include <vector>
#include <algorithm>

class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};

void test01()
{
	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(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() {

	test01();

	system("pause");

	return 0;
}

總結:

  • 求交集的兩個集合必須的有序序列
  • 目標容器開闢空間需要從兩個容器中取小值
  • set_intersection返回值既是交集中最後一個元素的位置

2 set_union

功能描述:

  • 求兩個集合的並集

函式原型:

  • set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

    // 求兩個集合的並集

    // 注意:兩個集合必須是有序序列

    // beg1 容器1開始迭代器
    // end1 容器1結束迭代器
    // beg2 容器2開始迭代器
    // end2 容器2結束迭代器
    // dest 目標容器開始迭代器

示例:

#include <vector>
#include <algorithm>

class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};

void test01()
{
	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() {

	test01();

	system("pause");

	return 0;
}

總結:

  • 求並集的兩個集合必須的有序序列
  • 目標容器開闢空間需要兩個容器相加
  • set_union返回值既是並集中最後一個元素的位置

3 set_difference

功能描述:

  • 求兩個集合的差集

函式原型:

  • set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);

    // 求兩個集合的差集

    // 注意:兩個集合必須是有序序列

    // beg1 容器1開始迭代器
    // end1 容器1結束迭代器
    // beg2 容器2開始迭代器
    // end2 容器2結束迭代器
    // dest 目標容器開始迭代器

示例:

#include <vector>
#include <algorithm>

class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};

void test01()
{
	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( 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 << "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() {

	test01();

	system("pause");

	return 0;
}

總結:

  • 求差集的兩個集合必須的有序序列
  • 目標容器開闢空間需要從兩個容器取較大值
  • set_difference返回值既是差集中最後一個元素的位置