C++ STL中的multiset key_comp()函数
在C++的STL库中,通过使用multiset容器可以存储一系列有序的元素,这些元素可以重复,但是它们的顺序必须是按照一个比较函数来确定。在multiset中,默认的比较函数是std::less,即元素的类型必须支持小于运算符。但是在某些情况下,我们需要使用不同于默认比较函数的函数来对multiset容器中的元素进行排序。这就需要使用multiset容器的key_comp()函数。
key_comp()函数的用法
multiset容器的key_comp()函数用于获取设置为容器排序准则的比较函数。返回的是一个比较函数对象,这个函数对象可以作为参数传递给其他容器构造函数等。比如,定义了以下的multiset容器,其中元素是一个结构体,需要按照结构体某个成员变量的值来排序。
#include <set>
#include <iostream>
struct Item {
int id;
double weight;
};
bool compare_by_id(const Item& x, const Item& y) {
return x.id < y.id;
}
struct CompareByWeight {
bool operator()(const Item& x, const Item& y) const {
return x.weight < y.weight;
}
};
int main()
{
std::multiset<Item, CompareByWeight> items;
items.insert(Item{1, 1.1});
items.insert(Item{2, 0.9});
items.insert(Item{3, 1.0});
auto comp = items.key_comp();
auto iter = items.begin();
while (comp(*iter, *(++iter))) {
std::cout << iter->weight << "\n"; // 输出1.0 1.1
}
return 0;
}
在上面的例子中,multiset容器的比较函数是CompareByWeight结构体的 operator()函数。通过调用key_comp()函数,获取用于排序的比较函数,并将其赋值给comp变量。在对multiset容器进行遍历时,可以传递比较函数对象comp,以确保元素顺序的正确性。
key_comp()函数的返回值类型
key_comp()函数返回的是容器元素的比较函数对象的const引用。多数情况下,这个比较函数是底层容器类型内嵌的类型,对于multiset类型,这个嵌套类型是Compare参数。
自定义比较函数的注意事项
当需要定义自己的比较函数时,需要注意以下几点:
- 比较函数必须是可调用的,并且它们必须返回一个bool类型的值。
- 如果两个元素被认为相等,则比较函数应该返回false,这是因为multiset容器允许元素可以重复。
- 如果按比较函数定义,第一个元素应该排在第二个元素之前,则比较函数返回true,否则返回false。
对于结构体和类,需要定义一个比较函数对象或者定义一个 operator<()函数,以方便容器默认的比较函数进行排序。比如,定义以下的Item结构体,并按照结构体内id成员的大小来排序。
#include <set>
#include <iostream>
struct Item {
int id;
double weight;
};
bool compare_by_id(const Item& x, const Item& y) {
return x.id < y.id;
}
int main()
{
std::multiset<Item, decltype(compare_by_id)*> items(compare_by_id);
items.insert(Item{1, 1.1});
items.insert(Item{2, 0.9});
items.insert(Item{3, 1.0});
auto comp = items.key_comp();
auto iter = items.begin();
while (comp(*iter, *(++iter))) {
std::cout << iter->id << "\n"; // 输出1 2
}
return 0;
}
在上面的例子中,定义了一个compare_by_id()比较函数,该函数用于按照Item结构体内id成员的大小来排序。在multiset容器的定义中,使用decltype(compare_by_id)*类型作为第二个模板参数,即比较函数的类型,该函数类型为指向compare_by_id()函数的指针。在构造multiset容器时,将compare_by_id()函数作为参数传递给构造函数,表示按照id成员大小进行排序。最后通过key_comp()函数获取排序函数,以便在遍历容器时使用。
总结
multiset容器的key_comp()函数提供了获取用于排序的比较函数对象的便捷方式。该函数返回的是一个比较函数对象的const引用,它可以作为参数传递给其他容器构造函数等。在定义自定义比较函数时,需要注意函数的可调用性、返回值和对相等元素的处理。通过灵活地使用比较函数,可以方便地自定义multiset容器元素的排序方式。