对映射c++中的矢量进行排序

Sort Vector in a Map c++

本文关键字:排序 映射 c++      更新时间:2023-10-16

我试图对映射中的一些向量进行排序,但当我运行程序时,我出现了Segmentation Fault。

typedef map<int, vector<int> > Map;
Map m;
for (Map::iterator it = m.begin(); it != m.end(); ++it) {
  sort(it->second.begin(), it->second.end());
}

就在排序之前,我有一个插入数据的部分:

int x = 2;
int y = 3;
map<int, vector<int> >::iterator itTemp;
itTemp = FontaneMapX.find(x);
if (itTemp == m.end())
    itTemp = m.insert(make_pair(x,vector<int>())).first;
itTemp->second.push_back(y);

我不会在这一部分之后删除/添加项目,也不会将事件添加到地图内的向量中。

对我应该改变什么有什么想法吗?

我怀疑您的程序在插入阶段排序之前会产生分段错误。

map<int, vector<int> >::iterator itTemp;
itTemp = FontaneMapX.find(x);  // should be m.find(x)?
if (itTemp == m.end())
    itTemp = m.insert(make_pair(x,vector<int>())).first;
itTemp->second.push_back(y);

如果find(x)函数调用将itTemp设置为m.end(),则会发生分段故障。在这种情况下,尝试调用itTemp->second.push_back(y)会导致segfault。

该部分应为

itTemp = FontaneMapX.find(x);
if (itTemp == m.end())
{
    itTemp = m.insert(make_pair(x,vector<int>())).first;
    itTemp->second.push_back(y);
}

或者更好,

itTemp = FontaneMapX.find(x);
if (itTemp == m.end())
{
    // Insert a vector with one element.
    itTemp = m.insert(std::make_pair(x,vector<int>(/*count*/1, y)));
}

或者使用C++11、

itTemp = FontaneMapX.find(x);
if (itTemp == m.end())
{
    // Insert a vector with one element.
    itTemp = m.insert(std::make_pair(x, std::vector<int>({y})));  // use initializer list
}

我想这个实现效果很好(http://ideone.com/QACBSZ)

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
map<int ,vector<int> > mp;
map<int, vector<int> >::iterator it;
int main() {
    int n;
    cin >> n;
    for(int i=0;i<n;i++){
        int m;
        cin >> m;
        vector <int> v(m);
        
        for(int j=0; j < m; j++)
            cin >> v[j];
        
        for(int j=0; j < m; j++)
            cout << v[j] << " ";
        
        cout << endl;
    
        mp.insert(make_pair(i,v));
    }
    for(it = mp.begin(); it != mp.end(); it++)
        sort(it->second.begin(), it->second.end());
    
    for(it = mp.begin(); it != mp.end(); it++){
        int l = it->second.size();
        cout << it->first << "th sorted array-> ";
        
        for(int j = 0; j < l; j++)
            cout << it->second[j] << " ";
        
        cout << endl;
    }
    return 0;
}