Verilen eleman(lar)ın bir dizisini temizleme

 

1,2,3,6,9,5,6,3,25,6,8,7,4 türünde bir veri kümesi içeren bir dizi var, örneğin 3'ün değerleri olmalıdır silindi ve çıktı 3 ve boş boşluklar olmadan aynı dizi olacak. ..

Bir dizi önemsiz değeri temizlemenin en hızlı yolunu arıyorum ...

aklıma bir örnek geliyor

 int ArrayDeleteEmpty( int &one[])
  {
   int two[];   int c= 0 ;
   for ( int i= 0 ; i< ArraySize (one); i++)
       if (one[i]!= NULL && one[i]!= "" )
        {
         c++;
         if ( ArrayResize (two,c, 10000 )>= 0 )
            two[c- 1 ]=one[i];
        }
   for ( int i= 0 ; i< ArraySize (two); i++)
       if ( ArrayResize (one,i+ 1 , 10000 )>= 0 )
         one[i]=two[i];
   return c;
  }

Daha ucuz ve daha hızlı bir yolu var mı?

 
Vladimir Pastushak :

1,2,3,6,9,5,6,3,25,6,8,7,4 tipinde bir veri seti içeren bir dizi var örneğin 3 değerlerini silmeniz gerekiyor ve çıktıda 3 ve boşluk olmadan aynı diziyi alın. ..

Bir dizi önemsiz değeri temizlemenin en hızlı yolunu arıyorum ...

aklıma bir örnek geliyor

Daha ucuz ve daha hızlı bir yolu var mı?

ArrayResize'ı döngülerden kaldırın ve (her LONG için savaşırsanız, koşulları kontrol edin ve sonunda tek bir Yeniden Boyutlandırma yapın)

ama bu, olduğu gibi, tipiktir - daha sonra toplu olarak yapılabilecek veya hiç yapılmayan her şeyi döngülerden çıkarmak ..

 

1. one[] dizisini aynı boyuttaki work[] dizisine yeniden yazın, gereksiz öğeleri hariç tutun ve gerekli olanları yerlerine kaydırın.

2. work[] dizisini yeni bir boyutun iki[] dizisine yeniden yazın.

Not: işlev çağrısını döngü operatöründen kaldırın ( ArraySize ).
 
int ArrayDeleteEmpty(const int del, int &one[])
  {
   int i = ArrayBsearch(one, del),
       y = ArraySize(one)-1;
   
   if(one[i] != del)
     return 0;
   
   for(; i<y; i++)
      one[i] = one[i+1];
   ArrayResize(one, y);
   
   return y;
  }
 

İşte bir seçenek:

 template < typename T>
int arrayFilter(T &data[], const T value)
{
   int dst = 0 , src = 0 ;
   for (; src < ArraySize (data); src++)
  {
     if (data[src] != value)
    {
       if (dst != src)
      {
        data[dst] = data[src];
      }
      dst++;
    }
  }
  
   if (dst < src)
  {
     ArrayResize (data, dst); // will only work with dynamic array
  }
   return dst;
}

void OnStart ()
{
   long array[] = { 1 , 2 , 3 , 6 , 9 , 5 , 6 , 3 , 25 , 6 , 8 , 7 , 4 };
   ArrayPrint (array, 0 , NULL , 0 , arrayFilter< long >(array, 3 ));
}

Filtrelenmiş dizideki öğelerin sayısını döndürür. Dinamik ise boyutunu otomatik olarak küçültebilir.

 
Stanislav Korotky :

İşte bir seçenek:

Filtrelenmiş dizideki öğelerin sayısını döndürür. Dinamik ise boyutunu otomatik olarak küçültebilir.

biraz daha (birkaç toprak çapı) ve işlevselliğe geleceğiz :-)

hedef ayarla [ filtre $kaynak [ lambda x { ifade $x !=3 } ] ]

bu tcl, lisp'te daha da kısa

 
En hızlı yol ArrayCopy() ile olur ve kaldırılacak öğeleri hareket ettirmemek için ters sırada döngü yapar.
 
Dmitry Fedoseev :
En hızlı yol ArrayCopy() ile olur ve kaldırılacak öğeleri hareket ettirmemek için ters sırada döngü yapar.

dizeleri içeren bir dizi yapı olabileceğinden uygun değildir.

 
Birinde 42 ürün, diğerinde 6, üçüncüde 30 ürün var. Böyle soru ve cevaplarla içinde ne olduğunu hayal etmeye korkuyorum.
 
TheXpert :
Birinde 42 ürün, diğerinde 6, üçüncüde 30 ürün var. Böyle soru ve cevaplarla içinde ne olduğunu hayal etmeye korkuyorum.

Aptalca bir soru, sorulan bir soru değil.

Sorunu çözmek için birkaç seçeneğim var ama daha iyi çözümler aramaya ve başkalarından öğrenmeye devam ediyorum.

 
Tanrıya şükür sadece bir tane var :) ... ürün ve bir çözüm.
Neden: