2012-03-22 106 views
-2

我有兩種類型的數據集。兩者大小相同。一個包含vector<int>,另一個包含vector<vector<double> >。 當我向前移動一個元素時,可以看到我的vector<int>中的一些重複項。所以,我想從vector<int>中刪除重複的元素(第二個元素)並繼續保留第一個元素。如果我擦除重複的元素,那麼同時我想合併來自我的vector<vector<double> >數據集的相應兩個向量的vector<double>。一旦我合併,我想刪除第二個vector<double>,因爲它已被添加到以前的vector<double>。通過這樣做,我希望進一步保留相同大小的數據集,而不會在第一個數據集中出現重複,也不會丟失第二個數據集中的任何元素。使用兩個向量 - 刪除重複項和合並

我已經實現了一個簡單的代碼,但我認爲它的邏輯錯誤。所以,你能幫我糾正這個代碼嗎?

vector<int>數據集被指定爲my_list vector<vector<double> >數據集被指定爲MYDATA

例如,這裏是我的兩個向量

my_list = {222, 208, 201, 201, 201, 206, 211, 222} 
mydata = {{a1,a2,a3},{b1,b2},{c1},{d1},{e1,e2},{f1,f2},{g1},{h1,h2,h3}} 

after, removing duplicate from the 1st vector and by merging corresponding vectors from 
2nd data, the final output would be like as 
my_list = {222, 208, 201, 206, 211, 222} 
mydata = {{a1,a2,a3},{b1,b2},{c1, d1, e1,e2},{f1,f2},{g1},{h1,h2,h3}} 




vector<int>::iterator   no, no2; 
vector<vector<double> >::iterator itr1, itr2; 
int i; 

for (no=my_list.begin(), no2=my_list.begin()+1, 
     itr1=mydata.begin(), itr2=mydata.begin()+1, i=0; no != my_list.end()-1; ){ 

     if (*no == *no2){ //current = next 
      no2 = my_list.erase(no2); 

      //add itr2 data to itr1 vector and erase itr2 
      mydata[i].insert(mydata[i].end(), (*itr2).begin(), (*itr2).end()); 
      itr2 = mydata.erase(itr2); 
     } 
     else{ 
      ++no; ++no2; 
      ++itr1; ++itr2; 
      ++i; 
     } 
} 
+0

不明白按問的問題。 – thb 2012-03-22 14:53:29

+0

@thb:對原始帖子做了一些更改。 – gnp 2012-03-22 15:06:38

+1

你編譯過嗎? 'push_back'是無效的,你不能將一個矢量推送到另一個矢量。你需要使用'vector :: insert'。 – 2012-03-22 15:52:55

回答

0

我最好不要修改原來的載體,如果你不沒有任何內存問題,它更簡單:

vector<int> res_my_list; 
vector<vector<double> > res_mydata; 

vector<int>::iterator curlist = my_list.begin(), endlist = my_list.end(); 
vector<vector<double> >::iterator curdata = mydata.begin(), enddata = mydata.end(); 

res_my_list.push_back(*curlist++); 
res_mydata.push_back(*curdata++); 

while(curlist != endlist) 
{ 
    if(res_my_list.back() == *curlist) 
     res_mydata.back().insert(res_mydata.back().end(), (*curdata).begin(), (*curdata).end()); 
    else 
    { 
     res_my_list.push_back(*curlist); 
     res_mydata.push_back(*curdata); 
    } 
    ++curlist; 
    ++curdata; 
} 
+0

感謝您的評論 – gnp 2012-04-03 08:43:16