주어진 요소의 배열 지우기

 

1,2,3,6,9,5,6,3,25,6,8,7,4 유형의 데이터 세트를 포함하는 배열이 있습니다. 예를 들어 3의 값은 다음과 같아야 합니다. 삭제되고 출력은 3과 빈 공간이 없는 동일한 배열이 됩니다. ...

정크 값 배열을 지우는 가장 빠른 방법을 찾고 있습니다...

예가 떠오른다

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

더 저렴하고 빠른 방법이 있습니까?

 
Vladimir Pastushak :

1,2,3,6,9,5,6,3,25,6,8,7,4 유형의 데이터 세트를 포함하는 배열이 있습니다. 예를 들어 3의 값은 다음과 같아야 합니다. 삭제되고 출력은 3과 빈 공간이 없는 동일한 배열이 됩니다. ...

정크 값 배열을 지우는 가장 빠른 방법을 찾고 있습니다...

예가 떠오른다

더 저렴하고 빠른 방법이 있습니까?

사이클에서 ArrayResize를 제거 하고 (각 LONG에 대해 싸우는 경우 조건을 확인하고 마지막에 단일 크기 조정을 수행하십시오)

그러나 이것은 일반적으로 나중에 대량으로 수행할 수 있거나 전혀 수행하지 않을 수 있는 모든 것을 주기에서 제거하는 것입니다.

 

1. one[] 배열을 같은 차원의 work[] 배열로 다시 작성합니다. 불필요한 요소는 제외하고 필요한 요소는 제자리에 옮깁니다.

2. work[] 배열을 새로운 차원의 two[] 배열로 다시 씁니다.

추신: 루프 연산자( 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;
  }
 

다음은 옵션입니다.

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

필터링된 배열의 요소 수를 반환합니다. 동적이면 자동으로 크기를 줄일 수 있습니다.

 
Stanislav Korotky :

다음은 옵션입니다.

필터링된 배열의 요소 수를 반환합니다. 동적이면 자동으로 크기를 줄일 수 있습니다.

조금 더(몇 개의 지구 직경) 그리고 우리는 기능에 올 것입니다 :-)

타겟 설정 [ $source 필터 [ 람다 x { expr $x !=3 } ] ]

이것은 tcl이며 lisp에서는 더 짧습니다.

 
가장 빠른 방법은 ArrayCopy() 를 사용하고 제거할 요소를 이동하지 않도록 역순으로 반복하는 것입니다.
 
Dmitry Fedoseev :
가장 빠른 방법은 ArrayCopy()를 사용하고 제거할 요소를 이동하지 않도록 역순으로 반복하는 것입니다.

문자열을 포함하는 구조의 배열이 있을 수 있으므로 적합하지 않습니다.

 
하나는 42개, 다른 하나는 6개, 세 번째는 30개. 이런 질문과 답변에 도대체 어떤 내용이 들어있을지 상상이 안 갑니다.
 
TheXpert :
하나는 42개, 다른 하나는 6개, 세 번째는 30개. 이런 질문과 답변에 도대체 어떤 내용이 들어있을지 상상이 안 갑니다.

어리석은 질문, 그것은 묻는 질문이 아닙니다.

문제를 해결할 수 있는 몇 가지 옵션이 있지만 계속해서 더 나은 솔루션을 찾고 다른 사람들로부터 배웁니다.

 
하나님께 감사드립니다 :) ... 제품과 솔루션이 하나뿐입니다.