在c ++中按降序打印映射值

时间:2015-12-21 19:58:14

标签: c++

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

我使用此功能打印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

如何按字数降序打印。

3 个答案:

答案 0 :(得分:3)

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

鉴于将迭代器解引用到map会产生const value_type&,我们可以利用该引用来避免实际创建value_type的副本(std::pair<Key, Value> )。但是,代码将比我们想要复制的时间稍长:

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岁

如果您的地图是非平凡的可复制元素,这应该会快得多。

答案 1 :(得分:2)

尝试以下方法:

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

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

答案 2 :(得分:0)

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