来自std :: map的前5个值

时间:2013-12-14 01:12:28

标签: c++

我已经有一个函数可以取出具有最多映射值的键值。

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

是否有一种简单的方法来扩展它以显示前五个结果? 我知道你可以将它复制到矢量中,但是我想要一种更简单的方法。

3 个答案:

答案 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);
}