【问题标题】:print map values in descending order in c++在 C++ 中按降序打印地图值
【发布时间】:2015-12-22 04:40:16
【问题描述】:

我有一个地图输入,其中包含单词列表及其计数。

我用这个函数打印map输入:

template <class KTy, class Ty>
void PrintMap(map<KTy, Ty> map)
{
    typedef std::map<KTy, Ty>::iterator iterator;
    for (iterator p = map.begin(); p != map.end(); p++)
        cout << p->first << ": " << p->second << endl;
}

它打印如下值: you : 296 she : 14 go : 29

如何按字数降序打印。

【问题讨论】:

    标签: c++


    【解决方案1】:

    尝试以下方法:

    // Copy it into a vector.
    std::vector<std::pair<std::string,int>> vector( map.begin(), map.end() );
    
    // Sort the vector according to the word count in descending order.
    std::sort( vector.begin(), vector.end(), 
               []( const auto & lhs, const auto & rhs ) 
               { return lhs.second > rhs.second; } );
    
    // Print out the vector.
    for ( const auto & item : vector )
        std::cout << item.first << ": " << item.second << std::endl;        
    

    地图是根据键排序的,即。 e.按字母顺序。你无法改变这种行为。因此,完成这项工作的最简单方法是将其复制到向量中并使用用户定义的比较函数对其进行排序。

    【讨论】:

    • 工作就像一个魅力:)
    • @MurhafSousli 已修复。现在它正在下降。
    【解决方案2】:

    map 存储按key 而非按值排序的元素。除非您想更改地图的类型,否则唯一的方法是在取出元素后对它们进行排序。我认为最简单的方法是通过std::sort

    鉴于将迭代器解引用到map 会得到const value_type&amp;,我们可以利用引用来避免实际创建value_type(即std::pair&lt;Key, Value&gt;)的副本。但是,代码会比我们想复制的要长一点:

    template <class KTy, class Ty>
    void PrintMap(const std::map<KTy, Ty>& map)
    {
        using vt = const typename std::map<KTy, Ty>::value_type*;
        std::vector<vt> vec(map.size());
        size_t i = 0;
        for(const auto& keyval : map)
        {
            vec[i++] = &keyval;
        }
        std::sort(std::begin(vec), std::end(vec), [](vt _lhs, vt _rhs){return _lhs->second > _rhs->second;});
    
        for(const auto& el : vec)
            std::cout << el->first << ": " << el->second << std::endl;
    }
    

    通过测试

    std::map<std::string, int> myMap{{"you", 296}, {"she", 14}, {"go", 29}};
    PrintMap(myMap);
    

    输出

    你:296

    去:29

    她:14 岁

    如果您的地图包含不可复制的元素,这应该会快得多。

    【讨论】:

    • 我想根据计数值打印它们,你能用一些代码更新你的答案吗?
    • @MurhafSousli:抱歉,被拉走了。更新帖子。
    【解决方案3】:

    将数据放入另一个容器中,按字数排序,打印。

    【讨论】:

    • 或使用 boost::multi_index
    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多