地图上max_element的模板函数需要知道这两种类型

时间:2011-08-18 15:36:21

标签: c++ templates stl

我正在尝试为地图编写一个自定义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;
}

3 个答案:

答案 0 :(得分:12)

std::map有一个名为value_type的嵌套类型,它实际上是std::pair<const K, V>的typedef。 std::pair有两种嵌套类型first_typesecond_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_typeT1::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的这项伟大作品。