c ++ set_intersection比较函数

时间:2015-07-24 08:07:58

标签: c++ algorithm comparison

使用<algorithm>中的函数时,通常会有一个额外的参数来自定义比较。但我不太了解有关论证的描述(Documentation of set_intersection)。

  

二进制函数,它接受由两个类型指向的类型的参数   输入迭代器,并返回一个可转换为bool的值。价值   return表示是否考虑第一个参数   它在第二个特定的严格弱顺序之前定义。该   函数不得修改其任何参数。这可以是一个   函数指针或函数对象。

它描述了该函数应该返回两个参数的顺序。但是在匹配函数中呢,例如:

#include <algorithm>
#include <iostream>

using namespace std;

void print (const char* name, int* start, int* end) {
    cout << name << ": ";
    while (start < end) 
        cout << *start++ << ", ";
    cout << endl;
}

bool func1 (int a, int b) { return a==b; }
bool func2 (int a, int b) { return a+b == 8; }

int main() {
  int set1[6] = {0, 1, 2, 4, 2, 4};
  int set2[6] = {1, 2, 3, 4, 5, 6};

  int set_without_comp[6];
  int* end_wo = set_intersection(set1, set1+6, set2, set2+6, set_without_comp);
  print ("set_without_comp", set_without_comp, end_wo);

  int set_with_comp1[6];
  int *end_w1 = set_intersection(set1, set1+6, set2, set2+6, set_with_comp1, func1);
  print ("set_with_comp1", set_with_comp1, end_w1);

  int set_with_comp2[6];
  int *end_w2 = set_intersection(set1, set1+6, set2, set2+6, set_with_comp2, func2);
  print ("set_with_comp2", set_with_comp2, end_w2);
}

我们得到输出:

set_without_comp: 1, 2, 4, 
set_with_comp1: 0, 1, 2, 2, 4, // Expect 1, 2, 4, 
set_with_comp2: 0, 1, 2, 2, 4, // Expect 2, 4, (maybe 6)

如何解释结果,在使用<algorithm>函数时编写比较函数的正确方法是什么,以及如何编写可以给我预期结果的函数?

3 个答案:

答案 0 :(得分:3)

std::set_intersection期望一个函数以与存储在集合中相同的方式关联两个元素。描述哪些元素是相同的,这不是一个函数,因为函数在内部工作。

因此,在您的示例中,set1不是正确的集合,因为它不是有序的(例如,升序)。如果它是有序的,您可以在std::set_intersection中使用相同的订单功能。例如:

int set1[6] = {0, 1, 2, 2, 2, 4}; // in order (<)

bool func1 (int a, int b) { return a < b; } // the only valid function

当您处理没有隐式顺序的复杂对象时,明确说明您要使用的顺序函数的功能非常有用。例如:

struct Person {
  std::string name;
  int age;
};

bool ascendingAge(const Person& guy1, const Person& guy2) {
  return guy1.age < guy2.age;
}

...

std::intersection(..., ..., ascendingAge);

答案 1 :(得分:1)

bool func1 (int a, int b) { return a==b; }bool func2 (int a, int b) { return a+b == 8; }都不会回答a是否必须在b之前回答。传递比较器等函数后得到的结果不能被解释为#34;它们是依赖于实现的无意义,因为STL被错误地使用 - 它期望一个函数说明a必须在b之前发生1}},但得到一个做其他事情的函数。 有效比较器的一些例子是:

bool func1 (int a, int b) { return a<b; }
bool func2 (int a, int b) { return a>b; }

答案 2 :(得分:1)

比较功能提供排序顺序。默认值为std :: less,此处为how to write such functions。如果要保持整数的升序排序,只需保留默认值,不要指定任何比较函数。