【问题标题】:How to sort C++ map keys with std::greater?如何使用 std::greater 对 C++ 映射键进行排序?
【发布时间】:2013-02-01 14:59:35
【问题描述】:

我在 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() - 但是当我包含这些问题时,我会收到关于函数返回函数的多个错误。

【问题讨论】:

  • 你倒着看地图的问题不是解决了吗?只是说。
  • 您是说使用std::map 的默认比较器时不会出现同样的错误吗?因为在这种情况下,这应该无关紧要。

标签: c++


【解决方案1】:

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

首选方案

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

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

std::map 具有std::pair 的类型定义(对表示)– std::map::value_type。 因此,例如,如果有 std::map&lt;int, int&gt;,则 std::map::value_type 将是 std::pair&lt;int, int&gt;

使用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));
    }
    

【讨论】:

  • 非常多。插入功能无法按您预期的方式工作。 :(
  • 啊,谢谢,我假设 C++ 的地图插入功能与 Java 的 map.put 相同 - 显然我应该研究更多:-(
  • @Exupery,顺便说一下,如果你在 Java 中使用过 HashMap 类,你可能想要使用 std::unordered_map 类(从 C++11 开始可用) – 哈希映射容器。
  • 谢谢,很高兴知道以备将来使用,但在这种特殊情况下,我确实需要订购地图。
【解决方案2】:

比谢尔盖的回答更迂腐(这也绝对有效),而是使用:

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 的未来版本中),那么可能性会小得多,但仍然可能发生这种变化。

【讨论】:

  • +1,对,你没看错:std::map::value_type很方便(std::map类型的参数就不重复了)。
猜你喜欢
  • 2019-11-16
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2022-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多