我已经有一个函数可以取出具有最多映射值的键值。
// Function for finding the occurances of colors or in this case hex values
void findOccurrances(double * mostNumTimes, map<string, int> &hexmap, string * colorlist)
{
map<string,int>::iterator it = hexmap.begin();
for( ;it != hexmap.end(); it ++)
{
if(*mostNumTimes <= it->second)
{
*mostNumTimes = it->second;
*colorlist = it->first;
}
}
}
是否有一种简单的方法来扩展它以显示前五个结果? 我知道你可以将它复制到矢量中,但是我想要一种更简单的方法。
答案 0 :(得分:4)
复制到矢量并不困难:
typedef std::pair<string, int> Pair;
std::vector<Pair> contents(hexmap.begin(), hexmap.end());
完成。
但要找到前5名,信不信由你<algorithm>
有一个功能模板可以完全按照你的意愿行事。在C ++ 11中,有用的是lambdas:
std::vector<Pair> results(5);
std::partial_sort_copy(
hexmap.begin(), hexmap.end(),
results.begin(), results.end(),
[](const Pair &lhs, const Pair &rhs) { return lhs.second > rhs.second; }
);
results
现在按降序排列前5个条目。
答案 1 :(得分:0)
我会交换键和值并创建新地图
std::map<int,std::string> dst;
std::transform(hexmap.begin(), hexmap.end(),
std::inserter(dst, dst.begin()),
[](const std::pair<std::string,int> &p )
{
return std::pair<int,std::string>(p.second, p.first);
}
);
现在以通常的方式打印前五个dst
值,
typedef std::map<int, std::string> Mymap;
Mymap::iterator st = dst.begin(), it;
size_t count = 5;
for(it = st; ( it != dst.end() ) && ( --count ); ++it)
std::cout << it->second << it->first <<std::endl ;
修改:
如果std::multimap
int
(密钥)std::string
(值)相同hexmap
,请使用{{1}}
答案 2 :(得分:0)
我对这些争论有点困惑。为什么以这种方式编写函数,我试着这样做。
string colorlist;
double max_val = 0;
for (int i = 0; i < 5; ++i)
{
findOccurrances(&max_val, hexmap, &colorlist);
cout << colorlist << " " << max_val << endl; // to do something
mapStudent.erase(colorlist);
}