C++ 以c+;降序打印地图值+;

C++ 以c+;降序打印地图值+;,c++,C++,我有一个地图输入,其中包含一个单词列表及其计数 我使用此功能打印地图输入: 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

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

我使用此功能打印
地图
输入:

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;
}
模板
无效打印地图(地图地图地图)
{
typedef std::map::迭代器迭代器;
for(迭代器p=map.begin();p!=map.end();p++)

不能首先将数据放入另一个容器,按字数排序,打印。

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

假设将迭代器解引用到
映射中
会给出
常量值类型&
,我们可以利用该引用避免实际创建
值类型
(这是一个
std::pair
)的副本。但是,代码将比我们想要复制的代码长一点:

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;
}
模板
void PrintMap(const std::map&map)
{
使用vt=consttypename std::map::value_type*;
std::vector向量(map.size());
尺寸i=0;
用于(常数自动和键值:映射)
{
vec[i++]=&keyval;
}
std::sort(std::begin(vec),std::end(vec),[](vt_-lhs,vt_-rhs){return_-lhs->second>_-rhs->second;});
用于(常数自动和el:vec)
std::cout first尝试以下操作:

// 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;        
//将其复制到向量中。
向量向量(map.begin(),map.end());
//根据字数降序排列向量。
排序(vector.begin(),vector.end(),
[](恒速自动和左侧、恒速自动和右侧)
{返回lhs.second>rhs.second;});
//打印出向量。
用于(常数自动&项:矢量)

std::cout或use boost::multi_indexI想根据计数值打印出来,你能用一些代码更新你的答案吗?@MurhafSousli:对不起,被撤走了。更新的帖子。像个符咒一样工作:)@MurhafSousli修复了它。现在它正在下降。
// 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;