您的位置:首页 > Web前端

STL algorithm算法set_difference,set_intersection(53)

2014-09-26 09:46 260 查看
set_difference原型:


std::set_difference

default (1)
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);

custom (2)
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);

该函数是获得两个集合的差集。

序列应该已经有序!

返回值为result中最后一个被覆盖元素下一位置的迭代器。

其行为类似于:

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result)
{
while (first1!=last1 && first2!=last2)
{
if (*first1<*first2) { *result = *first1; ++result; ++first1; }
else if (*first2<*first1) ++first2;
else { ++first1; ++first2; }
}
return std::copy(first1,last1,result);
}一个简单的例子:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void setdifference()
{
vector<int> vi{1,2,3,4,4,6,9,22,11};
vector<int> v2{1,2,3,5,4,9,8};
vector<int> vresult(6);

sort(vi.begin(),vi.end());
sort(v2.begin(),v2.end());
cout<<"vi=";
for(int i:vi)
cout<<i<<" ";
cout<<endl;
cout<<"v2=";
for(int i:v2)
cout<<i<<" ";
cout<<endl;
set_difference(vi.begin(),vi.end(),v2.begin(),v2.end(),vresult.begin());
cout<<"vreult=";
for(int i:vresult)
cout<<i<<" ";
cout<<endl;
}
运行截图:



set_intersection原型:


std::set_intersection

default (1)
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);

custom (2)
template <class InputIterator1, class InputIterator2,
class OutputIterator, class Compare>
OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);

该函数是求两个集合的交集。

同样的序列应该已经有序。

行为类似于:

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result)
{
while (first1!=last1 && first2!=last2)
{
if (*first1<*first2) ++first1;
else if (*first2<*first1) ++first2;
else {
*result = *first1;
++result; ++first1; ++first2;
}
}
return result;
}一个简单的例子:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void setintersection()
{
vector<int> vi{1,2,3,4,4,6,9,22,11};
vector<int> v2{1,2,3,5,4,9,8};
vector<int> vresult(6);

sort(vi.begin(),vi.end());
sort(v2.begin(),v2.end());
cout<<"vi=";
for(int i:vi)
cout<<i<<" ";
cout<<endl;
cout<<"v2=";
for(int i:v2)
cout<<i<<" ";
cout<<endl;
set_intersection(vi.begin(),vi.end(),v2.begin(),v2.end(),vresult.begin());
cout<<"vreult=";
for(int i:vresult)
cout<<i<<" ";
cout<<endl;

}
运行截图:



其中0是本来就有没有被覆盖的。更好的做法是使用for,然后利用set_intersection的返回值作为界限遍历。

——————————————————————————————————————————————————————————————————

//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。

转载请注明出处:http://blog.csdn.net/qq844352155

author:天下无双

Email:coderguang@gmail.com

2014-9-26

于GDUT

——————————————————————————————————————————————————
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm 算法 stl