根据对的第一个值对地图进行排序

Sort a map on the basis of first value of pair

假设我必须将我的地图描述为

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???***
}

此外,我想根据对的第一个值对其进行排序。

你可以在这里使用一些小技巧。

c++ 中的地图会自动按键排序所有内容,因此您可以执行以下操作 =>

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
      }
}

A std::map 按其键索引和排序。句号。

我只能想象 2 种可能的方法可以根据它的值排序

  • 反转结构,将给出顺序的元素作为键(这是@Suspicio 的回答)
  • 使用数据库世界中所谓的二级索引,这是一个辅助事物,将根据您的要求进行排序和指向真实数据。

在这里,如果您可以接受在使用它之前对它进行一次排序(如果您的地图一旦填充就不会更改,则不同)或 std::multimap 如果您希望能够轻松添加(或删除)项目。

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

您现在可以处理您的 sorted 地图:

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

每当您向原始 mp 地图添加或删除元素时,您只需更新 indices 多地图。