2013-12-14 43 views
0

我已經有了一個函數,它取出了映射值最大的鍵值。來自std :: map的前5個值

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

編輯

如果int(值)超過一個,則使用(鍵)在你的hexmap

+0

你可能想要'multimap',以防''hexmap'的'int'值不明顯。 –

+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,其有用地具有lambda表達式:

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