Limpar um conjunto de elementos definidos

 

Há uma matriz contendo um conjunto de dados do tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 você precisa remover, por exemplo, os valores 3 e obter a mesma matriz sem 3 e espaços vazios na saída...

Procuro a maneira mais rápida de eliminar uma série de valores desnecessários.

O seguinte exemplo vem à mente

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

Talvez haja uma maneira mais barata e rápida ?

 
Vladimir Pastushak:

Há uma matriz contendo um conjunto de dados do tipo 1,2,3,6,9,5,6,3,25,6,8,7,4 você precisa remover, por exemplo, os valores 3 e obter a mesma matriz sem 3 e espaços vazios na saída...

Procuro a maneira mais rápida de eliminar uma série de valores desnecessários.

O seguinte exemplo vem à mente

Talvez haja uma maneira mais econômica e rápida ?

ArrayResize deve ser removido dos laços, e (se estiver lutando por cada LONGO, verificar as condições e redimensionamento único no final)

Mas é meio típico tirar tudo dos laços, o que pode ser feito mais tarde a granel ou não fazer nada...

 

1. Reescrever array one[] em trabalho de array[] da mesma dimensão, removendo elementos desnecessários e deslocando os elementos necessários em seu lugar.

2. Reescrever o trabalho de matriz[] na matriz dois[] da nova dimensão.

HH: Remover chamada de função do operador de laço(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;
  }
 

Aqui está uma variante como esta:

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

Retorna o número de elementos da matriz filtrada. Pode reduzir automaticamente seu tamanho se for dinâmico.

 
Stanislav Korotky:

Aqui está uma variante como esta:

Retorna o número de elementos da matriz filtrada. Pode reduzir automaticamente seu tamanho se for dinâmico.

Mais alguns (mais alguns diâmetros de solo) e vamos chegar à funcionalidade :-)

estabelecer meta [ filtro $source [ lambda x { expr $x !=3 } ] ]

é tcl, é ainda mais curto em lisp

 
A maneira mais rápida seria com ArrayCopy() e loop through em ordem inversa, de modo a não mover aqueles elementos que serão apagados.
 
Dmitry Fedoseev:
A maneira mais rápida seria com ArrayCopy() e loop through em ordem inversa, de modo a não mover aqueles elementos que serão apagados.

não é adequado, pois pode haver um conjunto de estruturas contendo cordas.

 
Um tem 42 produtos, um tem 6, um tem 30. Tenho medo de imaginar como é um idiota com todas essas perguntas e respostas.
 
TheXpert:
Um tem 42 produtos, outro tem 6, outro tem 30. Tenho medo de imaginar que idiota há lá dentro com estas perguntas e respostas

Uma pergunta tola é uma pergunta não solicitada.

Tenho várias soluções para o problema, mas continuo procurando por melhores soluções e aprendendo com os outros.

 
Graças a Deus eu só tenho um :) ... produto e uma opção de solução.
Razão: