C++ STL中的multimap value_comp()函数
在使用multimap时,我们可能需要对其内部的键值对进行排序,由于multimap允许键值对的键值相同,因此需要一种强制排序的方法,value_comp()函数就是其中的常用之一。
multimap简介
multimap是C++ STL中的一个关联容器,它类似于map,但是允许键值相同,即一个键值可以对应多个值。它实现了基于红黑树的快速查找,插入和删除等操作。它的定义如下:
template <class Key, class T, class Compare=less<Key>, class Alloc=allocator<pair<const Key,T> > >
class multimap;
multimap的用法与map基本相同,只是插入操作与查找操作返回的对应迭代器有一些不同。
value_comp()函数
value_comp()函数是multimap中的成员函数,用于获取multimap中的排序方法。其定义如下:
value_compare value_comp() const;
其中,value_compare是一个仿函数类型,它可以用于比较multimap中的value类型,即pair
我们可以通过下面的代码来了解value_comp()函数的用法:
#include <iostream>
#include <map>
using namespace std;
int main() {
multimap<int, int> m;
m.insert(make_pair(1, 1));
m.insert(make_pair(2, 2));
m.insert(make_pair(2, 3));
m.insert(make_pair(3, 4));
m.insert(make_pair(3, 5));
auto comp = m.value_comp(); // 获取value_compare对象
auto it = m.begin();
auto end = m.end();
for (auto i = m.begin(); i != end; i++) {
if (comp(*i, *it)) { // 用value_compare对象比较value
it = i;
}
cout << i -> first << " " << i -> second << endl;
}
return 0;
}
运行上面的代码,结果应该为:
1 1
2 2
2 3
3 4
3 5
我们还可以通过定义一个自己的仿函数类型来实现value_comp()的功能,例如:
template <typename T>
struct value_less {
bool operator() (const T& a, const T& b) const {
return a.second < b.second;
}
};
int main() {
multimap<int, int> m;
m.insert(make_pair(1, 1));
m.insert(make_pair(2, 2));
m.insert(make_pair(2, 3));
m.insert(make_pair(3, 4));
m.insert(make_pair(3, 5));
value_less<pair<const int, int>> comp; // 自定义仿函数类型
auto it = m.begin();
auto end = m.end();
for (auto i = m.begin(); i != end; i++) {
if (comp(*i, *it)) {
it = i;
}
cout << i -> first << " " << i -> second << endl;
}
return 0;
}
运行结果与上面的代码一致。
结论
value_comp()函数是multimap中的一个重要成员函数,它可以用于获取multimap中的排序方法,并且可以定义自己的仿函数类型实现value_comp()的功能。在使用multimap时,我们可以上述方法来对键值对进行排序。