2013-02-16 107 views
6

我在C++中创建了一个std::map<int, int>,我希望它们的键从高到低排序,而不是默认的排序顺序。我的研究使我std::greater这看起来很有前途,但尝试使用它时,我得到一个编译错误:如何用std :: greater对C++映射键进行排序?

invalid type argument of unary ‘*’ (have ‘int’)

我的地图声明:

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

和错误正从该抛出功能:

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

答案如this类似的问题包括在声明中括号,即性病::更大() - 但是当我包含那些关于函数返回函数的多个错误。

+0

当你向后读地图时,你的问题是不是解决了?只是说。 – fonZ 2013-02-16 20:56:41

+0

你是说当你使用'std :: map'的默认比较器时你没有得到相同的错误?因为在这种情况下这应该不重要。 – 2013-02-16 21:00:28

回答

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; 
}; 

替代方案:

  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)); 
    } 
    
+0

非常多这个。插入功能无法按照您预期的方式工作。 :( – Xymostech 2013-02-16 20:59:59

+0

啊谢谢,我假定C++的地图插入的功能与Java的map.put相同 - 显然我应该研究更多:-( – Exupery 2013-02-16 21:08:33

+1

@Exupery,顺便说一句,如果您在Java中使用了'HashMap'类,你可能想使用'std :: unordered_map'类(从** C++ 11 **开始可用) - 散列映射容器。 – 2013-02-16 21:25:18

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的未来版本中),则不太可能,但仍有可能。

+0

+1,是的,你说得对:'std :: map :: value_type'非常方便(不重复'std :: map'类型的参数)。 – 2013-02-16 21:16:33

相关问题