Verilen eleman(lar)ın bir dizisini temizleme - sayfa 5

 
Konstantin Nikitin :
Eh, tamamen eldeki görev hakkında. Değeri kaldırın ve boşaltın

kritere göre filtrelemek için başka bir fonksiyon ekleyin ve daha iyi olacak. Hatta koleksiyona sürükleyebilirsiniz :-)

gibi bir şey

 int arrayFilter(T &data[], const T value, bool (*cmp)(const T&,const T&)=NotEqual<T>)

örneğin 3'ten büyük tüm değerleri çıkarmak için: arrayFilter<long>(array,3,GreaterThen<long>)

MQL şablonlarının bunu yapmanıza kolayca izin vereceğinden emin değilim.

 
TheXpert :

empoze etmem.

Teşekkür ederim, bugün naziksin :-)

Görev gereği. IMHO, veri toplamadan CarrayDouble gibi bir türle çalışmak daha uygundur. Benim örneğim:

 //--- https://www.mql5.com/ru/docs/standardlibrary/datastructures/carraydouble
#include <Arrays\ArrayDouble.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   double delta= 1 e- 3 ;
   CArrayDouble ArrDouble;
   ArrDouble.Delta(delta);
   double src_arr[]={ 1 , 2 , 3 , 6 , 9 , 5 , 6 , 3 , 25 , 6 , 8 , 7 , 4 };
   double value_to_delete= 3.0 ;
   if (ArrDouble.AddArray(src_arr))
     {
      ArrDouble.Sort();
       if (ArrDouble.IsSorted())
        {
         int first_idx,last_idx;
         first_idx=ArrDouble.SearchFirst(value_to_delete);
         last_idx=ArrDouble.SearchLast(value_to_delete);
         if (first_idx>= 0 )
           {
             PrintFormat ( "\nЭлементов до удаления: %d" ,ArrDouble.Total());
             if (ArrDouble.DeleteRange(first_idx,last_idx))
                   PrintFormat ( "Удалено элементов: %d" ,last_idx-first_idx+ 1 );             
             PrintFormat ( "Элементов после удаления: %d" ,ArrDouble.Total());         
           }
        }
     }
  }
//+------------------------------------------------------------------+

Doğru, bir dezavantaj var. Çıktı, sıralanmış bir dizidir.

 
Denis Kirichenko :
ohh, bazen sessiz kalmak ve aptal gibi görünmek...
 
TheXpert :
ohh, bazen sessiz kalmak ve aptal gibi görünmek...

söylemek ve tüm şüpheleri ortadan kaldırmak için her şeyden daha ....

 
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ı?

Dizide dolaşarak ve gereksiz değerleri ondan kaldırarak, kaldırılan hücrenin yerine bir sonraki hücredeki değerin üzerine yazın. Silinen değerden sonraki tüm değerleri sola kaydırın ve sayaçta silinen değerlerin sayısını sayın.

Ardından, silinen değerlerin sayısını dikkate alarak ArrayResize() yapın.

Tehdit. Silinmesi gereken değerleri aktarmayın. Sildikleriniz dışındaki tüm değerleri sola taşıyabilirsiniz.

Değerlerin sola kayması, silinen hücre sayısına eşit olmalıdır.

 
Vladimir Pastushak :

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.

Bu soruları yıllardır soruyorsunuz. Çok şey öğrendin mi? Üzgünüz, ancak ikinizin de bayt düzeyi ve temel dizilerle uğraştığınız ve orada kaldığınız açık.

Sorunun kendisi yanlış ifade edilmiştir. Görev, yinelenen değerleri (OGE seviyesinin görevi) kaldırmak değil, daha fazlası, görünüşe göre geçerli öğeler listesini güncelliyorsunuz. Eğer öyleyse, o zaman soru kulağa oldukça farklı gelmelidir. Katılımcıları ve her şeyden önce kendinizi şaşırtıyorsunuz ve yanıltıyorsunuz: İlke olarak katılımcılara yanlış kararı empoze edin ve onlardan bunu etkili hale getirmelerini isteyin.

 
Реter Konow :

Dizide dolaşmak ve gereksiz değerleri ondan çıkarmak, kaldırılan hücrenin yerine bir sonraki hücredeki değerin üzerine yazın. Silinen değerden sonraki tüm değerleri sola kaydırın ve sayaçta silinen değerlerin sayısını sayın.

Ardından, silinen değerlerin sayısını dikkate alarak ArrayResize() yapın.

Tehdit. Silinmesi gereken değerleri aktarmayın. Sildikleriniz dışındaki tüm değerleri sola taşıyabilirsiniz.

Değerlerin sola kayması, silinen hücre sayısına eşit olmalıdır.

 int Arr[ 20 ] = 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 ;
 int deleted;
//-------------- 
for ( int a1 = 0 ; a1 < ArraySize (Arr); a1++)
  {
   if (deleted)Arr[a1] = Arr[a1 + deleted];
   
   if (Arr[a1] == 3 )deleted++; 
  }
//-------------- 
ArrayResize (Arr, ArraySize (Arr) - deleted);

Bu seçeneğe göz atın.

 

Afedersiniz. Görünüşe göre satırların değiştirilmesi gerekiyor:


 int Arr[ 20 ] = 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 ;
 int deleted;
//-------------- 
for ( int a1 = 0 ; a1 < ArraySize (Arr); a1++)
  {
   if (Arr[a1] == 3 )deleted++; 

   if (deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize (Arr, ArraySize (Arr) - deleted);
 
Реter Konow :

Afedersiniz. Görünüşe göre satırların değiştirilmesi gerekiyor:

Bilmece: Malvina ona iki ve Papa Carlo'ya üç elma verirse Pinokyo'nun kaç elması olur?
Cevap: On. Kaynak değişkenlerin başlatılması gerekir.

 
Реter Konow :

Afedersiniz. Görünüşe göre satırların değiştirilmesi gerekiyor:


Başka bir iyileştirme:

 int Arr[ 20 ] = { 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 , 3 , 1 , 2} ;
int deleted;
//-------------- 
for ( int a1 = 0 ; a1 < ArraySize (Arr); a1++)
  {
   if (Arr[a1] == 3 )
     {
       if (deleted)a1-= deleted;//Cмещение назад.
      deleted++; 
     }
   if (deleted)Arr[a1] = Arr[a1 + deleted];
  }
//-------------- 
ArrayResize (Arr, ArraySize (Arr) - deleted);
Neden: