在地图c ++中排序矢量

时间:2013-08-24 23:02:18

标签: c++ algorithm sorting vector map

我正在尝试在地图中对某些向量进行排序,但是当我运行该程序时,我遇到了分段错误。

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);

我不会删除/添加此部分之后的项目,而不是地图内的矢量事件。

关于我应该改变什么的任何想法?

2 个答案:

答案 0 :(得分:0)

看到这个实现我觉得很有效 (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;
}

答案 1 :(得分:0)

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

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);

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

该部分应为

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
}