работа с двумя векторами - удаление дубликатов и слияние - PullRequest
0 голосов
/ 22 марта 2012

У меня есть два типа наборов данных.Оба в одном размере.Один содержит vector<int>, а другой содержит vector<vector<double> >.Когда я двигаюсь вперед один элемент за другим, я вижу некоторые дубликаты из моего vector<int>.Итак, я хочу удалить дублирующий элемент (2-й элемент) из vector<int> и сохранить первый элемент дальше.Если я удаляю дубликат элемента, то одновременно хочу объединить vector<double> соответствующих двух векторов из моего набора данных vector<vector<double> >.После объединения я хочу удалить 2-й 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;
       }
}

1 Ответ

0 голосов
/ 23 марта 2012

Лучше не изменять исходные векторы, если у вас нет проблем с памятью, это проще:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...