我正在尝试为 map 编写一个自定义 cmp 函数,这是一个对 map 的第二个元素进行比较的简单函数。我想将该函数用作模板,但我不知道如何将 map 的 .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;
}
最佳答案
std::map
有一个名为 value_type
的嵌套类型这实际上是 std::pair<const K, V>
的类型定义.和 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_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>);
关于c++ - map 上 max_element 的模板函数需要知道这两种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7110105/