C++ STL中的multimap key_comp
在C++ STL中,multimap是一个关联容器,它存储一个键-值对,不同的是multimap允许存在重复的键。
multimap具有一组成员函数,其中之一是key_comp()
。本文将介绍key_comp()
的用途和实现方法,并通过示例代码加深理解。
用途
key_comp()
是multimap
的成员函数,它返回一个用于比较multimap
键的比较函数对象。该函数对象用于保持multimap
中的键处于严格有序状态。
实现方法
key_comp()
方法的实现方法如下:
typedef _Key_compare key_compare;
constexpr key_compare key_comp() const
{return key_compare(_M_key_compare);}
其中_Key_compare
是一个模板类型,用于定义multimap中的比较函数对象类型。multimap
的比较函数对象从模板参数中派生,通常是通过面向对象编程中的函数对象类实现。除了传递给multimap
的键比较函数对象,multimap
还具有一个默认构造函数,该函数创建一个用于比较两个值的默认比较函数对象。
key_compare
具有以下性质:
- 它只有一个参数:两个multimap中的键的常量引用;
- 它返回一个布尔值,需要指示第一个参数是否小于第二个参数。
在multimap
中,键值是定义为pair类型,对于pair类型,key_compare()
定义如下:
struct _Rb_tree_node_base;
template<typename _Tp> struct _Rb_tree_node;
template<typename _Tp> struct _Rb_tree_value_type;
template<typename _Key, typename _Tp, typename _Compare = std::less<_Key>, typename _Alloc = std::allocator<std::pair<const _Key, _Tp>>>
class multimap
{
typedef typename _Alloc::template rebind<_Rb_tree_node<pair<const _Key, _Tp>>>::other _Node_allocator;
......
typedef _Rb_tree_value_type<pair<const _Key, _Tp>> __value_type;
private:
typedef _Rb_tree<pair<const _Key, _Tp>, __value_type, _Select1st<__value_type>, _Compare, _Node_allocator> _Rep_type;
public:
typedef typename _Rep_type::key_compare key_compare; //multimap的比较函数对象
...
key_compare key_comp() const
{
return _Rep_type()._M_key_compare;
}
...
};
实现过程中,multimap
维护一个私有成员变量_M_key_compare
,它表示multimap
中键的比较函数对象。由于键是一个pair类型,键比较函数对象是在创建multimap
对象时初始化的。
示例代码
#include <iostream>
#include <map>
int main() {
std::multimap<int, std::string> mymultimap;
std::multimap<int, std::string>::key_compare mycomp = mymultimap.key_comp();
mymultimap.insert(std::make_pair(30, "apple"));
mymultimap.insert(std::make_pair(50, "banana"));
mymultimap.insert(std::make_pair(40, "orange"));
mymultimap.insert(std::make_pair(40, "pear"));
mymultimap.insert(std::make_pair(60, "pomegranate"));
std::cout << "mymultimap contains:\n";
std::multimap<int, std::string>::iterator it = mymultimap.begin();
std::multimap<int, std::string>::iterator it_end = mymultimap.end();
while(it != it_end) {
std::cout << it->first << " => " << it->second << '\n';
it++;
}
std::cout << "\n";
std::cout << "mymultimap contains with key_comp:\n";
it = mymultimap.begin();
int prev_key = it->first;
std::cout << prev_key << " => " << it->second << '\n';
it++;
while(it != it_end) {
if (it->first != prev_key) {
std::cout << it->first << " => " << it->second << '\n';
prev_key = it->first;
}
it++;
}
return 0;
}
在示例代码中,我们创建了一个multimap
对象mymultimap
,并将一些键值对插入到其中。
通过mymultimap.key_comp()
方法,我们获取了一个用于比较mymultimap
中键的比较函数对象mycomp
。接着我们使用mycomp
比较函数对象的方法对mymultimap
进行了迭代,并以键的顺序返回键值对。
在使用mymultimap
对象时,可以使用key_comp()
方法获取不同的键的比较函数对象,以便按照不同的排序方式对键进行比较。
结论
key_comp()
方法是一个在C++ STL中可以用于返回multimap对象的键比较函数对象的有用方法。通过key_comp()
方法,我们可以获取一个用于比较multimap对象中键的比较函数对象。并且可以在实践中使用它来按照不同的排序方式对键进行比较,更好地管理multimap
对象中的数据。