如何对C++;使用std::greater映射键? 我在C++中创建了一个 /Cord>,我宁愿让它们从最高到最低排序,而不是默认排序顺序。我的研究让我找到了一个看起来很有希望的方法,但在尝试使用它时,我发现了一个编译错误:

如何对C++;使用std::greater映射键? 我在C++中创建了一个 /Cord>,我宁愿让它们从最高到最低排序,而不是默认排序顺序。我的研究让我找到了一个看起来很有希望的方法,但在尝试使用它时,我发现了一个编译错误:,c++,C++,一元“*”的类型参数无效(具有“int”) 我的地图声明是: std::map<int, int, std::greater<int> > numMap; 类似问题的答案,如在声明中包含括号,即std::greater()-但是当我包含这些参数时,我会得到关于函数返回函数的多个错误。问题-调用带有无效参数的std::map::insert成员函数:提供了两个整数值;但是必须有std::pair。请参阅参考资料: 更好的选择 为了方便(只是不要重复贴图类型参数),为贴图创

一元“*”的类型参数无效(具有“int”)

我的地图声明是:

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

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

问题-调用带有无效参数的
std::map::insert
成员函数:提供了两个整数值;但是必须有
std::pair
。请参阅参考资料:

更好的选择 为了方便(只是不要重复贴图类型参数),为贴图创建
typedef

typedef std::map<int, int> IntMap;
选择:
  • 使用
    std::make_pair()
    函数:

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

  • 比Sergey的答案更迂腐一点(这也确实有效),改用:

    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));
    }
    
    typedef std::map MyMap;
    MyMap-numMap;
    无效行::addNumber(int num,int pos)
    {
    insert(MyMap::value_type(num,pos));
    }
    

    这样做的好处是,如果更改映射的类型,以后要更改的代码就更少了。如果
    std::map
    的实现将其
    值类型
    std::pair
    更改为其他类型(在
    stl
    的未来版本中),则可能性要小得多,但仍然是可能的。当您反向阅读地图时,您的问题难道没有得到解决吗?只是说。你是说当你使用
    std::map
    的默认比较器时,你不会得到同样的错误吗?因为在这种情况下这一点都不重要,非常重要。insert函数的工作方式与您预期的不同:(啊,谢谢,我假设C++的map insert的功能与Java的map.put相同——显然我应该对此进行更多的研究:——(@Exupery,顺便说一下,如果您在Java中使用了
    HashMap
    class,您可能会想使用
    std::unordered_map
    class(从C++11开始提供)–散列映射容器。谢谢,很高兴知道如何在将来使用,不过在这个特定的实例中,我确实需要订购映射。+1,是的,你是对的:
    std::map::value_type
    非常方便(不要重复
    std::map
    type的参数)。
    void Row::addNumber(int num, int pos)
    {
        numMap.insert(std::pair<int, int>(num, pos));
    }
    
    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));
    }