2013-12-14 3 views
0

У меня уже есть функция, которая выдает значение ключа с самым отображаемым значением.Топ 5 значений из std :: map

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

Это для класса? Разве лектор еще не представил кучи? – kfsone

+0

Нет, это персональный проект. И я не знаю, что такое кучи. – user2520739

ответ

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 ; 

Edit:

Используйте std::multimap, если есть такие же int (значение) для более чем одного std::string (ключ) в вашем hexmap

+0

Вероятно, вы хотите использовать «multimap», если значения 'int'' hexmap' не различаются. –

+0

@SteveJessop обновлен, спасибо – P0W

+0

@ P0W У меня есть некоторые ошибки при попытке запустить ваш код. В последнем цикле он дает ошибку на st + 5. – user2520739

3

Копирование в вектор не так уж трудно:

typedef std::pair<string, int> Pair; 
std::vector<Pair> contents(hexmap.begin(), hexmap.end()); 

Готово.

Но, чтобы найти лучшие 5, поверьте или нет <algorithm> имеет шаблон функции, который делает именно то, что вы хотите. В C++ 11, которые полезно есть лямбды:

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 записей в порядке убывания.

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); 
} 
+0

Если бы я пробовал свой путь, я бы всегда получал одинаковые значения, поскольку findOccurrances отправляет только самое используемое значение. – user2520739

+0

Я так не думаю, потому что я удалил его после того, как нашел его. – sunnyleevip

Смежные вопросы