Limpar um conjunto de elementos definidos - página 4

 
Sim... Não há limites para a perfeição.
 

Sim... Monstros da programação...

Pessoalmente, eu escreveria aproximadamente o mesmo que @Dmitry Fedoseev, o código mais compreensível e ao mesmo tempo eficiente, respectivamente, a velocidade seria aproximadamente a mesma.

Eu acho que o código de @Nikolai Semko é uma grande perversão, mas eu acho que ele deve ser útil. E acho que é certo e bom, se cada milissegundo é importante.

 
Georgiy Merts:

Sim... Monstros da programação...

Pessoalmente, eu escreveria aproximadamente o mesmo que @Dmitry Fedoseev, o código mais compreensível e ao mesmo tempo eficiente, respectivamente, a velocidade seria aproximadamente a mesma.

Eu acho que o código de @Nikolai Semko é uma grande perversão, mas eu acho que ele deve ser útil. E acho que é certo e bom, se cada milissegundo é importante.

Não gosto que em ambos os casos haja múltiplos arrastamentos e quedas do mesmo item. Isto parece análogo à separação de bolhas - a mais lenta na grande maioria dos casos. É mais simples, mais claro e mais confiável fazer como é feito no DMS: os elementos são marcados para eliminação (contando quantos estão marcados), depois qualquer não marcado (uma vez) é movido para uma nova cópia com o número restante de elementos da matriz. Em termos de memória, isto, adicionalmente, ocupará apenas espaço para a matriz de bandeiras ("marked for delete"), e a segunda cópia abreviada da matriz, juntamente com a original, não exigirá mais memória do que a necessária para um ArrayResize. Também é possível acelerar a sinalização se não for um único valor que está sendo apagado, mas uma matriz, para que você não tenha que passar sempre por todos os seus valores. Para fazer isto, definir um máximo e um mínimo nele (para cordas isto também é possível) e pular elementos menores que o mínimo ou maiores que o máximo sem marcação.

 
Dmitry Fedoseev:

Você tem entrado na poça ultimamente, assim como nesta linha )

Vladimir Pastushak:

mostrar sua variante de realização

O Marketeer já tem uma variante escrita, que eu acho ótima, não vejo o sentido da duplicação, exceto que o tamanho do ciclo tira
 
Dmitry Fedoseev:

Assim é melhor:

A melhor opção, as medidas de velocidade devem confirmar isto.
 
TheXpert:

Você tem se metido numa poça ultimamente, como neste fio).

O Marketeer já escreveu uma opção que eu considero ótima, não vejo sentido em duplicá-la

Você tem falhado em sua tese de doutorado...

 
Vladimir:

Não gosto do fato de que em ambos os casos haja múltiplos arrastamentos e quedas do mesmo elemento.

Em ambos os casos, cada elemento é arrastado no máximo uma vez.
 
TheXpert:
Um tem 42 produtos, o outro 6, o terceiro 30. Tenho medo de imaginar que idiota há lá dentro com tais perguntas e respostas

O "especialista" é ótimo! Ele iluminou o público ao expor os encantos de Mercado :-)) Posso não ser um especialista, mas discordo totalmente de Dmitry Fedoseyev pessoalmente.

 
Denis Kirichenko:

Mas, pessoalmente, discordo totalmente de Dmitri Fedoseyev.

para não impor.

 
Pura e simplesmente na tarefa em mãos. Eliminar valor e vazio
template<typename T>
int arrayFilter(T &data[], const T value)
{
     int s, d = s = ArraySize(data);
     
     for(int i=d-1; i>=0; i--)
          if(data[i] == value || data[i] == NULL)
          {
               s--;
               for(int j=i; j<s; j++)
                    data[j]=data[j+1];
          }
  
     if(d > s)
          ArrayResize(data, s);
     
     return s;
}

void OnStart()
{
     long array[] = {1, 2, 3, 6, 9, 5, 6, 3, 25, ,, 6, 8, NULL, 7, NULL, 4};
     Print( arrayFilter<long>(array, 3) );
}