STL地图 – >按价值sorting?
我想知道如何实现STL地图按值sorting。
例如,我有一张地图m
map<int, int>; m[1] = 10; m[2] = 5; m[4] = 6; m[6] = 1;
然后..我想分类与米的价值。 所以,如果我打印地图,我想要得到的结果
m[6] = 1 m[2] = 5 m[4] = 6 m[1] = 10
这个。
我怎么能这样sorting? 有没有什么办法可以处理与sorting值的关键和价值?
您可以构build第二个地图,第一个地图的值为键,第一个地图的键为值。
这只有在所有值都不同的情况下才有效。 如果你不能假设这一点,那么你需要build立一个多地图,而不是地图。
首先把所有的键值对都转换成一个set<pair<K, V> >
,其中set
是用一个小于函子的函数来构造的,该函数只比较这个对的第二个值。 这样,即使您的值不是完全不同,您的代码仍然可以工作。
或者将键值对转储到一个vector<pair<K, V> >
,然后使用相同的小于仿函数对该向量进行sorting。
我想知道如何实现STL地图按值sorting。
根据定义 ,你不能。 地图是一个按键排列元素的数据结构。
你应该使用Boost.Bimap这种事情。
我刚刚在我的c ++书中做了类似的问题。 我提出的答案可能不是很有效,
int main() { string s; map<string, int> counters; while(cin >> s) ++counters[s]; //Get the largest and smallest values from map int beginPos = smallest_map_value(counters); int endPos = largest_map_value(counters); //Increment through smallest value to largest values found for(int i = beginPos; i <= endPos; ++i) { //For each increment, go through the map... for(map<string, int>::const_iterator it = counters.begin(); it != counters.end(); ++it) { //...and print out any pairs with matching values if(it->second == i) { cout << it->first << "\t" << it->second << endl; } } } return 0; } //Find the smallest value for a map<string, int> int smallest_map_value(const map<string, int>& m) { map<string, int>::const_iterator it = m.begin(); int lowest = it->second; for(map<string, int>::const_iterator it = m.begin(); it != m.end(); ++it) { if(it->second < lowest) lowest = it->second; } return lowest; } //Find the largest value for a map<string, int> int largest_map_value(const map<string, int>& m) { map<string, int>::const_iterator it = m.begin(); int highest = it->second; for(map<string, int>::const_iterator it = m.begin(); it != m.end(); ++it) { if(it->second > highest) highest = it->second; } return highest; }
创build另一个映射,提供一个less()函数的基础上的值不是关键,AND函数应该返回true,如果value1 <= value2(不严格<)。 在这种情况下,具有非不同值的元素也可以被sorting。