R!sh! Ответов: 3

Удаление дубликатов значений в 2d массиве


у меня есть 5700 строк и 3 столбца 2d-массива.
нужно исключить повторяющуюся строку из этого массива и вывести только одну строку из нескольких повторяющихся строк.
граф=5700.
например,
24.742235	0.005334	0.052465	
27.345229	-0.222687	0.266042	
27.345229	-0.222687	0.266042	
25.528389	-0.063540	0.117000	
24.742235	0.005334	0.052465	
25.528389	-0.063540	0.117000	
24.742235	0.005334	0.052465	
25.528389	-0.063540	0.117000	
24.742235	0.005334	0.052465	
25.528389	-0.063540	0.117000	
27.345229	-0.222687	0.266042	
24.742235	0.005334	0.052465	
27.345229	-0.222687	0.266042	
25.528389	-0.063540	0.117000	
25.528389	-0.063540	0.117000	
27.345229	-0.222687	0.266042	
27.345229	-0.222687	0.266042	
24.742235	0.005334	0.052465	
24.742235	0.005334	0.052465	
27.345229	-0.222687	0.266042	


Что я уже пробовал:

for(p=0;p<count;p++)
{
for(ppp=p+1;ppp<count;ppp++)
{
if(plane[ppp][1]!=plane[p][1])
{
printf("%lf\t%lf\t%lf\n",plane[p][0],plane[p][1],plane[p][2]);
printf("%lf\t%lf\t%lf\n",plane[ppp][0],plane[ppp][1],plane[ppp][2]);
}
}
}

3 Ответов

Рейтинг:
5

CPallini

Пользуясь преимуществами C++ библиотека, вы можете использовать std::set класс. Например:

#include <iostream>
#include <set>
using namespace std;


struct DataInfo
{
  double d[3];

  bool operator()( const DataInfo & dia, const DataInfo & dib) const
  {
    for (size_t n=0; n<3; ++n)
    {
      if ( dia.d[n] < dib.d[n] ) return true;
      if ( dia.d[n] > dib.d[n] ) return false;
    }
    return false;
  }
};

int main()
{
  set <DataInfo, DataInfo> sdi;

  for (;;)
  {
    DataInfo di;
    cin >> di.d[0] >> di.d[1] >> di.d[2];
    if ( cin.eof()) break;
    sdi.insert(di);
  }


  for (const auto & di : sdi)
    cout << di.d[0] << " " << di.d[1] << di.d[2] << endl;
}


Рейтинг:
23

OriginalGriff

Если вы хотите удалить все дубликаты, чтобы у вас остались только отдельные строки, то самый простой способ-отсортировать входные данные так, чтобы дубликаты были рядом друг с другом.
таким образом, удаление дублированных строк тривиально.

C и C++ включают в себя библиотечные процедуры для сортировки массива.


R!sh!

можете ли вы дать логику для сортировки такого типа массива?

OriginalGriff

Посмотрите на "стандартную" библиотеку C qsort - вы вызываете ее с указателем на Ваш массив данных, количество элементов в этом массиве, размер каждого элемента и функцию сравнения. Вы пишете функцию, которая получает два указателя на ваши элементы данных для сравнения.

R!sh!

ОКК спасибо

Рейтинг:
19

Jochen Arndt

Решение, которое не меняет порядок (непроверенное):

/* Print first item */
printf("%lf\t%lf\t%lf\n",plane[0][0],plane[0][1],plane[0][2]);
for(p=1;p<count;p++)
{
    /* Check if a duplicate (already printed) */
    for(ppp=0;ppp<p;ppp++)
    {
        if(plane[p][1]==plane[ppp][1])
            break;
    }
    /* Not a duplicate if above loop not terminated */
    if (p >= ppp)
        printf("%lf\t%lf\t%lf\n",plane[p][0],plane[p][1],plane[p][2]);
}