set_difference用于自定义结构

时间:2011-11-10 00:25:17

标签: c++ stl set

我试图找到以下两组之间的区别:

A = {(0,0), (0,1), (1,0), (1,1), (2,2)}

B = {(0,0), (0,1), (1,0), (1,1)}

我期待的答案是

A - B = {(2,2)}

我尝试了以下代码。但我无法编译。谁能指出我犯的错误?

#include <vector>
#include <algorithm>
#include <iostream>
#include <utility>

using namespace std;

class compare
{
  public:
    bool operator()(const pair <int, int> elem1, const pair <int, int> elem2)
    {
      return ((elem1.first == elem2.first) && 
          (elem1.second == elem2.second));
    }
};

int main()
{
  vector < pair<int, int> > v, va, vb;
  va.push_back(make_pair(0,0));
  va.push_back(make_pair(0,1));
  va.push_back(make_pair(1,0));
  va.push_back(make_pair(1,1));
  va.push_back(make_pair(2,2));

  vb.push_back(make_pair(0,0));
  vb.push_back(make_pair(0,1));
  vb.push_back(make_pair(1,0));
  vb.push_back(make_pair(1,1));


  vector < pair<int, int> >::iterator it, result;
  result = set_difference (va.begin(), va.end(),
      vb.begin(), vb.end(), 
      inserter(v, v.end()), 
      compare());

  // for (it = v.begin( ) ; it != result; it++)
  //   cout << "(" << it->first << it->second << ")" << ", ";
  // cout << endl;

  return 0;
}

编辑: 编译错误消息如下:

set_difference.cc: In function `int main()':
set_difference.cc:36: error: no match for 'operator=' in 'result = std::set_difference [with _InputIterator1 = __gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >, _InputIterator2 = __gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >, _OutputIterator = std::insert_iterator<std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >, _Compare = compare]((&va)->std::vector<_Tp, _Alloc>::begin [with _Tp = std::pair<int, int>, _Alloc = std::allocator<std::pair<int, int> >](), (&va)->std::vector<_Tp, _Alloc>::end [with _Tp = std::pair<int, int>, _Alloc = std::allocator<std::pair<int, int> >](), (&vb)->std::vector<_Tp, _Alloc>::begin [with _Tp = std::pair<int, int>, _Alloc = std::allocator<std::pair<int, int> >](), (&vb)->std::vector<_Tp, _Alloc>::end [with _Tp = std::pair<int, int>, _Alloc = std::allocator<std::pair<int, int> >](), std::inserter [with _Container = std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >, _Iterator = __gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >](((std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > >&)(&v)), (&v)->std::vector<_Tp, _Alloc>::end [with _Tp = std::pair<int, int>, _Alloc = std::allocator<std::pair<int, int> >]()), (compare(), compare()))'
/usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_iterator.h:587: note: candidates are: __gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >& __gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >::operator=(const __gnu_cxx::__normal_iterator<std::pair<int, int>*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int> > > >&)

3 个答案:

答案 0 :(得分:3)

(这是解决算法的正确性,而不是编译问题。)

阅读documentation:两个输入范围已经必须排序

您还必须为结果提供输出迭代器

这样做:

std::sort(va.begin(), va.end(), compare());
std::sort(vb.begin(), vb.end(), compare());

set_difference(va.begin(), va.end(), vb.begin(), vb.end(),
               std::back_inserter(v), compare());

您的compare函数还应定义严格,弱排序,而不是相等比较。

顺便说一句,std::pair<S, T>std::tuple<T...>已经内置了字典比较,所以除非你想要一些异国情调,否则你通常不需要定义自己的比较:{{1}等等。

答案 1 :(得分:1)

你的期望是错误的:A - B是A中的一组元素,在B中也找不到,在你的情况下是空集,因为A中的每个元素也在B中找到.B - A会给出结果你期待。

答案 2 :(得分:1)

好的,现在发布了错误消息,很明显是什么问题: set_difference返回输出迭代器,在本例中为insert_iterator(通过调用inserter构建)。您尝试将其分配给result这是一个矢量迭代器。这是一种类型不匹配。

最简单的解决方案是省略该赋值和迭代器result,因为无论如何都不需要迭代器;结果已写入v