使用<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>
函数时编写比较函数的正确方法是什么,以及如何编写可以给我预期结果的函数?
答案 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。如果要保持整数的升序排序,只需保留默认值,不要指定任何比较函数。