Effacement d'un tableau d'élément(s) défini(s) - page 5

 
Konstantin Nikitin:
Purement sur la tâche à accomplir. Enlever la valeur et vider

ajoutez une fonction pour pouvoir filtrer par critère et vous serez prêt. Vous pourriez même l'ajouter à votre collection :-)

quelque chose comme

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

pour extraire toutes les valeurs supérieures à 3 : arrayFilter<long>(array,3,GreaterThen<long>).

Je ne suis pas sûr que les modèles MQL permettent de le faire facilement.

 
TheXpert:

Je ne m'impose pas.

Merci, vous êtes gentil aujourd'hui :-)

A propos de la tâche. Je pense qu'il est plus pratique de travailler avec un type de collection de données commeCArrayDouble. Mon exemple :

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

Il y a cependant un inconvénient. La sortie sera un tableau trié.

 
Denis Kirichenko:
Ohhh, parfois il vaut mieux être silencieux et passer pour un idiot que...
 
TheXpert:
Ohhh, parfois il vaut mieux être silencieux et passer pour un idiot que...

que de dire quoi que ce soit et de dissiper tout doute....

 
Vladimir Pastushak:

Il y a un tableau contenant un ensemble de données de type 1,2,3,6,9,5,6,3,25,6,8,7,4 ; vous devez supprimer par exemple les valeurs 3 et obtenir le même tableau sans 3 et sans espaces vides dans la sortie...

Je cherche le moyen le plus rapide d'effacer les valeurs inutiles d'un tableau...

L'exemple suivant me vient à l'esprit

Peut-être existe-t-il un moyen plus économique et plus rapide ?

En parcourant le tableau en boucle et en supprimant les valeurs inutiles, vous écrasez la valeur de la cellule suivante à la place de la valeur supprimée. Décalez vers la gauche toutes les valeurs suivant la valeur effacée et comptez le nombre de valeurs effacées dans le compteur.

Ensuite, faites ArrayResize() en tenant compte du nombre de valeurs effacées.

Zy. Ne déplacez pas les valeurs que vous voulez effacer. Vous pouvez décaler vers la gauche toutes les valeurs, sauf celles que vous effacez.

Le décalage des valeurs vers la gauche doit être égal au nombre de cellules effacées.

 
Vladimir Pastushak:

Une question idiote est une question non posée.

J'ai plusieurs solutions au problème, mais je continue à chercher de meilleures solutions et à apprendre des autres.

Vous posez des questions similaires depuis plusieurs années maintenant. Avez-vous appris beaucoup de choses ? Désolé, mais vous semblez en être resté au niveau des octets et des tableaux élémentaires.

La question elle-même est formulée de manière incorrecte. La tâche n'est pas de supprimer les valeurs dupliquées (tâche de niveau GCE) mais dans quelque chose de beaucoup plus grand, vous devez mettre à jour la liste des éléments valides. Si c'est le cas, la question devrait être complètement différente. Vous confondez et induisez en erreur les participants et, en premier lieu, vous-même : vous imposez aux participants la mauvaise solution de principe et vous demandez de la rendre effective.

 
Реter Konow:

En parcourant le tableau en boucle et en supprimant les valeurs indésirables, écrasez la valeur dans la cellule suivante à la place de la valeur supprimée. Décalez vers la gauche toutes les valeurs suivant la valeur effacée et comptez le nombre de valeurs effacées dans le compteur.

Ensuite, faites ArrayResize() en tenant compte du nombre de valeurs effacées.

Zy. Ne déplacez pas les valeurs que vous voulez effacer. Vous pouvez décaler vers la gauche toutes les valeurs, sauf celles que vous effacez.

Le décalage des valeurs vers la gauche doit être égal au nombre de cellules effacées.

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

Cochez cette option.

 

Désolé. On dirait que les lignes doivent être inversées :


 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:

Désolé. On dirait que les lignes doivent être inversées :

Devinette : Combien de pommes aura Pinocchio si Pinocchio lui donne deux pommes et Papa Carlo lui en donne trois ?
Réponse : dix. Les variables sources doivent être initialisées.

 
Реter Konow:

Désolé. On dirait que les lignes doivent être inversées :


Il reste encore du travail à faire :

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