我有一个地图输入,其中包含单词列表及其计数。
我使用此功能打印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
如何按字数降序打印。
答案 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)
将数据放入另一个容器中,按字数排序,打印。