Limpar um conjunto de elementos definidos - página 5

 
Konstantin Nikitin:
Puramente sobre a tarefa em mãos. Remover valor e esvaziar

adicionar uma função para que você possa filtrar por critério e você estará pronto para ir. Você poderia até adicioná-lo à sua coleção :-)

algo como

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

para extrair todos os valores superiores a 3: arrayFilter<long>(array,3,GreaterThen<long>).

Não estou certo de que os modelos MQL permitam fazê-lo facilmente

 
TheXpert:

Eu não estou impondo.

Obrigado, você é gentil hoje :-)

Sobre a tarefa. Imho é mais conveniente operar com um tipo de coleta de dados comoCArrayDouble. Meu exemplo:

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

Mas há uma desvantagem. A saída será uma matriz ordenada.

 
Denis Kirichenko:
Ohhh, às vezes é melhor ficar em silêncio e parecer um idiota do que...
 
TheXpert:
Ohhh, às vezes é melhor ficar em silêncio e parecer um idiota do que...

do que dizer qualquer coisa e esclarecer qualquer dúvida....

 
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 ?

Ao fazer looping através da matriz e remover valores desnecessários, você sobrescreve o valor na próxima célula no lugar da célula removida. Deslocar para a esquerda todos os valores após o valor apagado e contar o número de valores apagados no contador.

Em seguida, faça ArrayResize() levando em conta o número de valores apagados.

Zy. Não mova os valores que você deseja apagar. Você pode mudar para a esquerda todos os valores, exceto aqueles que você apaga.

A mudança de valores para a esquerda deve ser igual ao número de células apagadas.

 
Vladimir Pastushak:

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.

Há vários anos você vem fazendo perguntas semelhantes. Você já aprendeu muito? Desculpe, mas você parece ter permanecido no nível de bytes e arrays elementares.

A questão em si é formulada incorretamente. A tarefa não é remover valores repetidos (tarefa de nível GCE), mas em algo muito maior, você deve atualizar a lista de itens válidos. Se assim for, a questão deve soar completamente diferente. Você confunde e engana os participantes e, antes de tudo, a si mesmo: imponha aos participantes a solução errada em princípio e peça para torná-la eficaz.

 
Реter Konow:

Ao fazer looping através da matriz e remover valores indesejados dela, sobrescreva o valor na próxima célula no lugar do valor removido. Deslocar para a esquerda todos os valores após o valor apagado e contar o número de valores apagados no contador.

Em seguida, faça ArrayResize() levando em conta o número de valores apagados.

Zy. Não mova os valores que você deseja apagar. Você pode mudar para a esquerda todos os valores, exceto aqueles que você apaga.

A mudança de valores para a esquerda deve ser igual ao número de células apagadas.

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

Marque esta opção.

 

Desculpe. Parece que as linhas precisam ser invertidas:


 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:

Desculpe. Parece que as linhas precisam ser invertidas:

Enigma: Quantas maçãs Pinóquio terá se Pinóquio lhe der duas maçãs e Papa Carlo lhe der três?
Resposta: Dez. As variáveis de origem precisam ser inicializadas.

 
Реter Konow:

Desculpe. Parece que as linhas precisam ser invertidas:


Mais trabalho a ser feito:

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