2013-08-24 80 views
3

我想排序我的地圖內的一些向量,但是當我運行該程序時,我有一個分段錯誤。排序向量在地圖C++

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

只是排序之前,我有一個插入DATAS節:

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

我不刪除/本節中,沒有事件到地圖裏面的載體後,添加項目。

我應該改變什麼想法?

+1

我這裏跑了你的代碼http://ideone.com/wBKuDP並且沒有段錯誤。這不是確鑿的,它可能是偶然的。但是我看不出代碼有什麼問題,所以也許別的東西會導致錯誤。 –

+1

順便說一句,你也可以做到這一點,可能會更清楚:'vector &vec = m [x]; if(vec.empty())vec.push_back(y);'如果它不存在,它將使用默認構造函數創建值。 –

+3

@Neil不需要'if(vec.empty())'測試,它也不會出現在OP的代碼中。只要做'm [x] .push_back(y);' - 一行而不是四行。 ;-) –

回答

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

我懷疑你的程序產生分段故障之前排序,在插入階段。如果itTempfind(x)函數調用設置爲m.end()發生

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