6

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

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

我的地图声明是:

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

这个函数抛出了错误:

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

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

4

2 回答 2

7

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

首选方案

方便起见(只是为了不重复地图类型参数),为地图创建一个typedef

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

具有(对表示)的std::map类型定义- 。因此,例如,如果有 a the would be 。std::pairstd::map::value_typestd::map<int, int>std::map::value_typestd::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;
};

备择方案:

  1. 使用std::make_pair()功能:

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

    void Row::addNumber(int num, int pos)
    {
        numMap.insert(std::pair<int, int>(num, pos));
    }
    
于 2013-02-16T20:58:41.510 回答
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_type从更改std::pair为其他内容(在 的未来版本中stl),您将不受该更改的影响。

于 2013-02-16T21:05:56.427 回答