您的位置:首页 > 其它

STL源码学习----集合相关算法

2012-05-22 22:39 435 查看
  STL一共提供了四种与集合相关的算法,分别是并集(union), 交集(intersection),差集(difference),对称差集(symmetric difference)。

  这四种集合算法要求处理的两个序列都是非递减有序的,而且处理后的结果集合没有重复的元素。

  下面是这四种集合算法的具体实现,为了方便起见,我去掉了模板,集合中的数据类型用int。

1,并集union

void my_union(int *s1, int len1,
int *s2, int len2,
int *result)
{
int first1=0, first2=0;

while(first1 != len1 && first2 != len2)
{
if(s1[first1] < s2[first2]){
*result = s1[first1];
first1++;
}
else if(s1[first1] > s2[first2]){
*result = s2[first2];
first2++;
}
else{
*result = s1[first1];
first1++;
first2++;
}
result++;
}

while(first1 != len1)
*result++ = s1[first1++];
while(first2 != len2)
*result++ = s2[first2++];
}


2,交集intersection

  intersection的实现比较简单,只有s1和s2中两个元素相同的时候才将元素拷贝进result中。

  

void my_intersection(int *s1, int len1,
int *s2, int len2,
int *result)
{
int first1=0,first2=0;

while(first1 != len1 && first2 != len2)
{
if(s1[first1] < s2[first2])
first1++;
else if(s1[first1] > s2[first2])
first2++;
else{
*result++ = s1[first1];
first1++;
first2++;
}
}
}


3,差集difference

  差集difference构造出集合s1-s2。

void my_difference(int *s1, int len1,
int *s2, int len2,
int *result)
{
int first1=0, first2=0;

while(first1 != len1 && first2 != len2)
{
if(s1[first1] < s2[first2]){
*result++ = s1[first1];
first1++;
}
else if(s1[first1] > s2[first2])
first2++;
else{
first1++;
first2++;
}
}

while(first1 != len1)
*result++ = s1[first1++];
}


4,对称差集symmetric_difference

  对称差集返回“属于s1但不属于s2”且“属于s2但不属于s1”的每一个元素。
  

void my_symm_difference(int *s1, int len1,
int *s2, int len2,
int *result)
{
int first1=0,first2=0;

while(first1 != len1 && first2 != len2)
{
if(s1[first1] < s2[first2]){
*result++ = s1[first1];
first1++;
}
else if(s1[first1] > s2[first2]){
*result++ = s2[first2];
first2++;
}
else{
first1++;
first2++;
}
}

while(first1 != len1)
*result++ = s1[first1++];
while(first2 != len2)
*result++ = s2[first2++];
}


  以上这些算法都不算很难,但是STL以一种统一的编程方式将上面的四种算法高效地实现。值得学习和回味。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: