我有一种情况,我必须按降序存储一些学生的标记。所以创建了一个map<marks,string>
。当地图以堆的形式存储数据时,始终最高标记将位于顶部。但问题是,当我为两名学生留下相同的分数时,我必须根据他们的名字对他们进行排名(按照字母顺序考虑他们的名字的第一个字母)。
我做了什么:这次我将标记和名称分成另一个地图,其中键作为名称,标记为值。然后以相反的方式打印新地图。然后从我离开旧地图的地方继续。但这需要创建额外的地图并涉及大量处理。
我的问题有更好的方法吗?
答案 0 :(得分:0)
你可以创建一个UserDefaults
或类似的东西来存储一个标记的所有名称。列表带有map<marks, list<string> >
方法,因此您可以对包含多个条目的所有列表进行排序。
如果您一次插入所有内容,则可以
如果密钥不存在,则创建一个列表
将名称附加到商标列表
迭代所有键
如果值大于1
打印。
答案 1 :(得分:0)
我要做的是拥有这样的地图:
map<marks, vector<string>>
因此,每个标记都绑定到排序的学生数组。每当你想要一个新学生插入一个向量时,你只需找到正确的索引来保持你的矢量排序(二分法搜索是最快的)
您也可以使用list<string>
代替vector
答案 2 :(得分:0)
基本上你需要一个可以非升序存储重复键(int)的Map和非降序的值(字符串)。
我有一种情况,我必须按降序存储一些学生的分数。
使用std::greater
以便密钥以降序顺序存储:
std::map<int, string, std::greater<int> > m;
但是当我为两名学生留下相同的印记时,问题就出现了。
使用 Multimap 代替Map。 Multimap存储重复的键,这是它的专长。
std::multimap<int, string, std::greater<int> > m;
然后我必须根据他们的名字对他们进行排名(按字母顺序排列,考虑他们的姓名&#39;第一个字母)。
将矢量中的相同键的值存储在矢量中&gt;对矢量进行排序&gt;将排序后的矢量插回到地图中。 请注意,在multimap内部,您不必担心更改密钥或其顺序。值是唯一会改变其顺序的值(也仅在同值键内)。
multimap<int, string, greater<int> >:: iterator it = m.begin(), st; //Stores duplicate keys(marks).
vector<string> vec;
int lastKey = INT_MAX;
while(it != m.end())
{
if(it->first < lastKey)
{
//Sort the Names
sort(vec.begin(), vec.end());
for(int i = 0; i < vec.size(); i++){
st->second = vec[i];
st++;
}
st = it;
vec.clear();
}
vec.push_back(it->second); //Insert name
lastKey = it->first; //marks of last inserted name.
it++;
}
//Do same for the last(lowest valued key in map) key.
sort(vec.begin(), vec.end());
for(int i = 0; i < vec.size(); i++){
st->second = vec[i];
st++;
}
答案 3 :(得分:0)
您可以使用set<pair<mark, string>/*optional appropriate-comparator*/>
。它首先使用标记排序,然后命名。
与排序后的矢量解决方案
相反,它仍然是O(log n)
的排序插入