如果键相同,如何使用其值来定义地图元素?

时间:2016-08-07 06:40:59

标签: c++ hashmap keyvaluepair

我有一种情况,我必须按降序存储一些学生的标记。所以创建了一个map<marks,string>。当地图以堆的形式存储数据时,始终最高标记将位于顶部。但问题是,当我为两名学生留下相同的分数时,我必须根据他们的名字对他们进行排名(按照字母顺序考虑他们的名字的第一个字母)。

我做了什么:这次我将标记和名称分成另一个地图,其中键作为名称,标记为值。然后以相反的方式打印新地图。然后从我离开旧地图的地方继续。但这需要创建额外的地图并涉及大量处理。

我的问题有更好的方法吗?

4 个答案:

答案 0 :(得分:0)

你可以创建一个UserDefaults或类似的东西来存储一个标记的所有名称。列表带有map<marks, list<string> >方法,因此您可以对包含多个条目的所有列表进行排序。 如果您一次插入所有内容,则可以

  1. 如果密钥不存在,则创建一个列表

  2. 将名称附加到商标列表

  3. 迭代所有键

    1. 如果值大于1

    2. ,则对其进行排序
    3. 打印。

答案 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内部,您不必担心更改密钥或其顺序。值是唯一会改变其顺序的值(也仅在同值键内)。

Demo

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)的排序插入