c++ 根据对的第一个值对Map进行排序

gfttwv5a  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(180)

假设我必须将我的Map描述为:

map<int, pair<long, int>> mp;

现在,我将图元插入为:

int y; long x;
pair<long, int> p;

for(int i = 0; i < 5; i++)
{ 
    cin >> x >> y;
    p.first = x;
    p.second = y;
    mp.insert({i, p});   // What is wrong here syntax wise?
}

而且,我想根据这个对的第一个值来排序。

rggaifut

rggaifut1#

你可以用一个小技巧。
c++中的Map会自动按键对所有内容进行排序,因此您可以执行以下操作=〉

map <long, (set,vector) < int > > mp; //Create this kind of map
//it will sort elements by first value and depending on your needs, select vector or set
//if you need to sort elements by second value use set
//if you do not care about it use vector

long x;
int y;
for (int i = 0; i < n; i++)
{
   cin >> x >> y;
   if (mp.find(x) != mp.end()) // if element exist
      {
         mp[x].push_back(y); // add it to vector
      }
      else
      {
         mp[x] = vector < int > (); // if not create new vector
         mp[x].push_back(y); // and then push new element
      }
}
f0brbegy

f0brbegy2#

一个std::map,在索引中,并按键排序。句号。
我只能想象两种可能的方法来让它 * 排序 * 根据它的值:

  • 反转该结构体,使给出顺序的元素作为键(这是@Suspicio的答案)
  • 使用数据库世界中所谓的“次要”索引,这是一个辅助的“东西”,将根据您的要求排序并指向真实的数据。

在这里,如果您可以接受在使用它之前对它进行一次排序(如果您的map在填充后不发生变化,则情况有所不同),我将使用整数向量(实际map的键),如果您希望能够轻松地添加(或删除)项目,则使用std::multimap

multimap<long, int> indices;
for (auto elt : mp) {
    indices.insert({ elt.second.first, elt.first });
}

您现在可以处理您的 sorted Map:

for (auto index : indices) {
    auto elt = mp.find(index.second); // *elt will give the elements in order
    ...
}

只要在原始mpMap中添加或删除元素,就必须更新indices多Map。

相关问题