Cancellare un array di elementi definiti - pagina 5

 
Konstantin Nikitin:
Puramente sul compito da svolgere. Rimuovere il valore e svuotare

aggiungete una funzione che vi permetta di filtrare per criterio e sarete a posto. Potresti anche aggiungerlo alla tua collezione :-)

qualcosa come

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

per estrarre tutti i valori maggiori di 3: arrayFilter<long>(array,3,GreaterThen<long>).

Non sono sicuro che i modelli MQL permetteranno di farlo facilmente

 
TheXpert:

Non mi sto imponendo.

Grazie, sei gentile oggi :-)

Riguardo al compito. Imho è più conveniente operare con un tipo di raccolta dati comeCArrayDouble. Il mio esempio:

//--- 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());         
           }
        }
     }
  }
//+------------------------------------------------------------------+

C'è però uno svantaggio. L'output sarà un array ordinato.

 
Denis Kirichenko:
Ohhh, a volte è meglio tacere e sembrare uno stupido che...
 
TheXpert:
Ohhh, a volte è meglio tacere e sembrare uno stupido che...

che dire qualcosa e chiarire qualsiasi dubbio....

 
Vladimir Pastushak:

C'è un array che contiene un insieme di dati di tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 è necessario rimuovere ad esempio i valori 3 e ottenere lo stesso array senza 3 e spazi vuoti nell'output...

Sto cercando il modo più veloce per cancellare un array di valori non necessari...

Mi viene in mente il seguente esempio

Forse c'è un modo più economico e veloce?

Passando attraverso l'array e rimuovendo i valori non necessari, si sovrascrive il valore nella cella successiva al posto di quello rimosso. Spostare a sinistra tutti i valori che seguono il valore cancellato e contare il numero di valori cancellati nel contatore.

Poi fate ArrayResize() tenendo conto del numero di valori cancellati.

Zy. Non spostate i valori che volete cancellare. Potete spostare a sinistra tutti i valori tranne quelli che cancellate.

Lo spostamento dei valori a sinistra dovrebbe essere uguale al numero di celle cancellate.

 
Vladimir Pastushak:

Una domanda stupida è una domanda non fatta.

Ho diverse soluzioni al problema, ma continuo a cercare soluzioni migliori e a imparare dagli altri.

Sono diversi anni che fai domande simili. Hai imparato molto? Scusate, ma sembra che siate rimasti al livello dei byte e degli array elementari.

La domanda stessa è formulata in modo scorretto. Il compito non è quello di rimuovere i valori duplicati (compito del livello GCE) ma in qualcosa di molto più grande, è necessario aggiornare la lista degli elementi validi. Se è così, la domanda dovrebbe suonare completamente diversa. Confondete e ingannate i partecipanti e, prima di tutto, voi stessi: imponete ai partecipanti una soluzione sbagliata in linea di principio e chiedete di renderla efficace.

 
Реter Konow:

Scorrendo la matrice e rimuovendo i valori indesiderati da essa, sovrascrivere il valore nella cella successiva al posto del valore rimosso. Spostare a sinistra tutti i valori che seguono il valore cancellato e contare il numero di valori cancellati nel contatore.

Poi fate ArrayResize() tenendo conto del numero di valori cancellati.

Zy. Non spostate i valori che volete cancellare. Potete spostare a sinistra tutti i valori tranne quelli che cancellate.

Lo spostamento dei valori a sinistra dovrebbe essere uguale al numero di celle cancellate.

 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);

Seleziona questa opzione.

 

Mi dispiace. Sembra che le linee debbano essere invertite:


 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:

Mi dispiace. Sembra che le linee debbano essere invertite:

Indovinello: quante mele avrà Pinocchio se Pinocchio gli dà due mele e papà Carlo gliene dà tre?
Risposta: Dieci. Le variabili di origine devono essere inizializzate.

 
Реter Konow:

Mi dispiace. Sembra che le linee debbano essere invertite:


Altro lavoro da fare:

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);
Motivazione: