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

 

Il existe 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

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

Peut-être existe-t-il un moyen plus rapide et moins cher ?

 
Vladimir Pastushak:

Il existe 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 ?

ArrayResize devrait être supprimé des boucles, et (si lutter pour chaque LONG, vérifier les conditions et un seul Resize à la fin)

Mais c'est un peu typique de tout sortir des boucles, ce qui peut être fait plus tard en vrac ou de ne pas le faire du tout...

 

1. Réécrire le tableau one[] en tableau work[] de la même dimension, en supprimant les éléments inutiles et en déplaçant les éléments requis à leur place.

2. Réécrit le tableau work[] en tableau two[] de la nouvelle dimension.

HH : Suppression de l'appel de fonction de l'opérateur de boucle(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;
  }
 

Voici une variante de ce type :

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

Renvoie le nombre d'éléments dans le tableau filtré. Peut réduire automatiquement sa taille s'il est dynamique.

 
Stanislav Korotky:

Voici une variante de ce type :

Renvoie le nombre d'éléments dans le tableau filtré. Peut réduire automatiquement sa taille s'il est dynamique.

Quelques autres (quelques diamètres de sol supplémentaires) et nous arriverons à la fonctionnalité :-)

set target [ filter $source [ lambda x { expr $x !=3 } ]

c'est tcl, c'est encore plus court en lisp

 
Le moyen le plus rapide serait d'utiliser ArrayCopy() et de boucler dans l'ordre inverse, afin de ne pas déplacer les éléments qui seront supprimés.
 
Dmitry Fedoseev:
Le moyen le plus rapide serait d'utiliser ArrayCopy() et de boucler dans l'ordre inverse, afin de ne pas déplacer les éléments qui seront supprimés.

ne convient pas, car il peut y avoir un tableau de structures contenant des chaînes de caractères.

 
L'un a 42 produits, l'autre 6, l'autre 30. J'ai peur d'imaginer quel trou du cul c'est à l'intérieur avec toutes ces questions et réponses.
 
TheXpert:
L'un a 42 produits, un autre en a 6, un autre en a 30. J'ai peur d'imaginer quel trou du cul il y a à l'intérieur avec ces questions et ces réponses.

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.

 
Heureusement que je n'en ai qu'une :) ... produit et une option de solution.
Raison: