如何使用std :: greater对C ++映射键进行排序?

时间:2013-02-16 20:52:09

标签: c++

我在C ++中创建一个std::map<int, int>,我希望他们将键从最高到最低排序,而不是默认的排序顺序。我的研究引导我std::greater看起来很有希望,但在尝试使用它时,我遇到了编译错误:

  

一元'*'的无效类型参数(有'int')

我的地图声明是:

std::map<int, int, std::greater<int> > numMap;

错误是从这个函数抛出的:

void Row::addNumber(int num, int pos) {
    numMap.insert(num, pos);
}

this等类似问题的答案包括声明中的括号,即std :: greater () - 但是当我包含这些问题时,我会收到有关返回函数的函数的多个错误

2 个答案:

答案 0 :(得分:7)

问题 - 使用无效参数调用std::map::insert成员函数:提供了两个整数值;但必须 std::pair<int, int>。请参阅参考资料:std::map::insert

优先选项

对于方便(仅不重复地图类型参数),为地图创建typedef

typedef std::map<int, int> IntMap;

std::map具有std::pair的类型定义(配对表示) - std::map::value_type。 因此,例如,如果std::map<int, int> std::map::value_type std::pair<int, int>std::map::value_type

使用IntMap::value_type构造函数(在这种情况下为class Row { public: void Row::addNumber(int num, int pos) { m_numMap.insert(IntMap::value_type(num, pos)); } private: typedef std::map<int, int> IntMap; IntMap m_numMap; }; ):

std::make_pair()

备选方案:

  1. 使用#include <utility> ... void Row::addNumber(int num, int pos) { numMap.insert(std::make_pair(num, pos)); } 功能:

    std::pair
  2. 直接使用void Row::addNumber(int num, int pos) { numMap.insert(std::pair<int, int>(num, pos)); } 构造函数:

    {{1}}

答案 1 :(得分:5)

比谢尔盖的答案(这也肯定有效)更迂腐,而不是使用:

typedef std::map<int, int, std::greater<int> > MyMap;
MyMap numMap;

void Row::addNumber(int num, int pos)
{
    numMap.insert(MyMap::value_type(num, pos));
}

好处是,如果您更改地图的类型,您可以减少以后更改的代码。如果std::map的实施将value_typestd::pair更改为其他内容(在stl的未来版本中),则不太可能但仍然可能,您是不可能的对那种变化。