STLalgorithm算法set_difference,set_intersection(53)


STLalgorithm算法set_difference,set_intersection(53)

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

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






发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注