C++标准库---已序算法之三合并元素

合并元素


两个已序集合的总和

merge(source1Beg,source1End,source2Beg,source2End,destBeg)

merge(source1Beg,source1End,source2Beg,source2End,destBeg,op)

(1)两者都将源区间[source1Beg,source1End)和[source2Beg,source2End)内的元素合并,使得“以destBeg起始的目标区间”内含两个源区间的所有元素;

(2)目标区间内的所有元素按顺序排列;
(3)两者都返回目标区间内“最后一个被复制元素”的下一位置;

(4)op是一个可有可无的二元判断式,被当做排序准则:
op(elem1,elem2)

(5)源区间没有任何变化;

(6)根据标准,调用者应当确保两个源区间一开始都已序,然而在大多数实做版本中,上述算法可以将两个无序的源区间内的元素合并到一个无序的目标区间中;

(7)调用者必须保证目标区间足够大,要不就得使用插入型迭代器;

(8)目标区间和源区间不得重迭;

(9)list提供了一个特殊成员函数merge(),用来合并两个list;

(10)复杂度:线性;


两个已序集合的并集


set_union(source1Beg,source1End,source2Beg,source2End,destBeg)

set_union(source1Beg,source1End,source2Beg,source2End,destBeg,op)

(1)两者都将源区间[source1Beg,source1End)和[source2Beg,source2End)内的元素合并,得到“以destBeg起始”的目标区间---这个区间内含的元素要不来自第一源区间,要不就来自第二源区间,或同时来自两个源区间;

(2)目标区间内的所有元素都按顺序排序;

(3)同时出现于两个源区间的元素,在并集区间中将只出现一次,不过如果原来的某个源区间内原来就存在重复元素,则目标区间内也会有重复元素---重复的个数是两个源区间内的重复个数的叫大值;

(4)两者都返回目标区间内“最后一个被复制元素”的下一位置;

(5)op是一个可有可无的二元判断式,被当做排序准则:
op(elem1,elem2)

(6)源区间没有任何变化;

(7)调用者必须保证目标区间足够大,要不就得使用插入型迭代器;

(8)调用者应当确保两个源区间一开始都已序;

(9))目标区间和源区间不得重迭;

(10)复杂度:线性;


两个已序集合的交集

set_intersection(source1Beg,source1End,source2Beg,source2End,destBeg)

set_intersection(source1Beg,source1End,source2Beg,source2End,destBeg,op)

(1)两者都将源区间[source1Beg,source1End)和[source2Beg,source2End)内的元素合并,得到“以destBeg起始”的目标区间---这个区间内含的元素不但存在于第一源区间,也存在于第二源区间;

(2)如果某个源区间内原就存在有重复元素,则目标区间内也会有重复元素---重复的个数是两个源区间内的重复个数的较小值;


两个已序集合的差集

set_difference(source1Beg,source1End,source2Beg,source2End,destBeg)

set_difference(source1Beg,source1End,source2Beg,source2End,destBeg,op)

(1)两者都将源区间[source1Beg,source1End)和[source2Beg,source2End)内的元素合并,得到“以destBeg起始”的目标区间---这个区间内含的元素只存在于第一源区间,不存在于第二源区间;

(2)如果某个源区间内原就存在有重复元素,则目标区间内也会有重复元素---重复的个数是第一源区间内的重复个数减去第二源区间内的相应重复个数,如果第二区间内的重复个数大于第一区间内的相应重复个数,目标区间内的对应重复个数将会是零;



set_symmetric_difference(source1Beg,source1End,source2Beg,source2End,destBeg)

set_symmetric_difference(source1Beg,source1End,source2Beg,source2End,destBeg,op)

(1)两者都将源区间[source1Beg,source1End)和[source2Beg,source2End)内的元素合并,得到“以destBeg起始”的目标区间---这个区间内含的元素或存在于第一源区间,或存在于第二源区间,但不同时存在于两院区间内;

(2)如果某个源区间内就存在有重复元素,则目标区间内也会有重复元素---重复的个数是两个源区间内的对应重复元素的个数差额;


综合代码示例:

#include"fuzhu.h"

using namespace std;

int main()
{
	int c1[]={1,2,2,4,6,7,7,9};
	int num1=sizeof(c1)/sizeof(int);

	int c2[]={2,2,2,3,6,6,8,9};
	int num2=sizeof(c2)/sizeof(int);

	cout<<"c1: ";
	copy(c1,c1+num1,ostream_iterator<int>(cout," "));
	cout<<endl;

	cout<<"c2: ";
	copy(c2,c2+num2,ostream_iterator<int>(cout," "));
	cout<<endl;

	cout<<endl;

	cout<<"merge(): ";
	merge(c1,c1+num1,c2,c2+num2,ostream_iterator<int>(cout," "));
	cout<<endl;

	cout<<"set_union(): ";
	set_union(c1,c1+num1,c2,c2+num2,ostream_iterator<int>(cout," "));
	cout<<endl;

	cout<<"set_intersection(): ";
	set_intersection(c1,c1+num1,c2,c2+num2,ostream_iterator<int>(cout," "));
	cout<<endl;

	cout<<"set_difference(): ";
	set_difference(c1,c1+num1,c2,c2+num2,ostream_iterator<int>(cout," "));
	cout<<endl;

	cout<<"set_symmetric_difference(): ";
	set_symmetric_difference(c1,c1+num1,c2,c2+num2,ostream_iterator<int>(cout," "));
	cout<<endl;

	system("pause");
	return 0;
}

运行结果:

C++标准库---已序算法之三合并元素_第1张图片

你可能感兴趣的:(算法,合并,merge)