2012-03-22 2 views
-2

두 가지 유형의 데이터 집합이 있습니다. 둘 다 같은 크기입니다. 하나는 vector<int>이고 다른 하나는 vector<vector<double> >입니다. 한 요소를 다른 요소로 이동하면 vector<int>에서 중복 된 부분을 볼 수 있습니다. 따라서 vector<int>에서 중복 요소 (두 번째 요소)를 삭제하고 첫 번째 요소를 추가로 유지하려고합니다. 중복 요소를 지우면 동시에 vector<vector<double> > 데이터 세트의 해당 두 벡터 중 vector<double>을 병합하고 싶습니다. 내가 합병되면, 이전에 vector<double>에 추가 된대로 2nd 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

+0

@thb : 원래 게시물을 약간 변경했습니다. – gnp

+1

컴파일 했습니까? 'push_back'은 유효하지 않습니다. 벡터를 다른 벡터로 푸시 할 수 없습니다. 'vector :: insert'를 사용해야합니다. –

답변

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