我正在尝试为地图编写一个自定义cmp函数,这是一个简单的映射,用于比较地图的第二个元素。我想将该功能作为模板,但我无法弄清楚如何将地图的.first
和.second
类型传递给我的cmp函数。我的非工作代码在下面,由于T1和T2的类型没有传递,因此显然会失败:
#include <map>
#include <vector>
#include <algorithm>
template<class T1, class T2>
bool pairCompare(const std::pair<T1,T2> & x,
const std::pair<T1,T2> & y) {
return x.second < y.second;
}
template<class T1>
typename T1::iterator map_max_element(const T1 & A) {
// How do I pass the type to pairCompare?
return std::max_element(A.begin(), A.end(), pairCompare<?????>);
}
int main() {
std::map<std::vector<double>, int> A;
map_max_element(A);
return 0;
}
答案 0 :(得分:12)
std::map
有一个名为value_type
的嵌套类型,它实际上是std::pair<const K, V>
的typedef。 std::pair
有两种嵌套类型first_type
和second_type
。使用此信息:
template<class T>
typename T::const_iterator map_max_element(const T & A)
{
typedef typename T::value_type pair_type;
typedef typename pair_type::first_type K;
typedef typename pair_type::second_type V;
return std::max_element(A.begin(), A.end(), pairCompare<K,V>);
}
请注意,在您的代码中,返回类型是错误的。它应该是const_iterator
,而不是iterator
,因为在函数A
中是const map。因此,您可以从中获得const_iterator
。 : - )
或者您可以简单地将比较函数编写为:
template<class T>
bool pairCompare(const T & x, const T & y) {
return x.second < y.second;
}
并将其用作:
return std::max_element(A.begin(), A.end(), pairCompare<typename T::value_type>);
答案 1 :(得分:2)
您可以使用T1::key_type
和T1::mapped_type
,或者更简单地使用T1::value_type
,这相当于std::pair<T1::key_type,T1::mapped_type>
。
答案 2 :(得分:2)
与海报有同样的问题。我尝试了提出的答案。只需稍加修改即可正常工作。
这是最终的代码,可以用一个小例子来测试。
#include <iostream>
#include <map>
using namespace std;
template<class T>
bool pairCompare(const T & x, const T & y)
{
return x.second < y.second;
}
template<class T>
typename T::const_iterator map_max_element(const T &A)
{
typedef typename T::value_type pair_type;
return max_element(A.begin(), A.end(), pairCompare<typename T::value_type>);
}
int main()
{
map<float, int> A;
map<float, int>::const_iterator it;
// Data insert
A.insert ( pair<float, int>( -2, 1) );
A.insert ( pair<float, int>( 0, 5) );
A.insert ( pair<float, int>( 2, -5) );
it = map_max_element(A);
cout << "Row with maximum second element of a Map: " << (*it).first << " , " << (*it).second << endl;
return 0;
}
享受代码并感谢Nawan的这项伟大作品。