定義された要素の配列をクリアする。

 

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毎に苦労するならば、条件をチェックして最後にシングルResize)

でも、ループから全部取り出すのは、後でまとめてやればいいし、まったくやらないのも、なんだか典型的なやり方ですね......。

 

1.配列one[]を同じ次元の配列work[]に書き換え、不要な要素を取り除き、必要な要素をその場所に移動させます。

2.配列work[]を新しい次元の配列2[]に書き換えます。

HH:ループ演算子(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:

こんなバリエーションがあります。

フィルタリングされた配列の要素数を返します。動的な場合は自動的にサイズを縮小できる。

あと数本(グラウンドの直径が数本)あれば、機能的に使えるようになります :-)

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

tclだから、lispならもっと短い。

 
最速の方法は、ArrayCopy() を使用して、削除される要素を動かさないように逆順でループさせることです。
 
Dmitry Fedoseev:
最速の方法は、ArrayCopy()を使用して、削除される要素を動かさないように逆順でループさせることです。

は適さない。文字列を含む構造体の配列が存在する可能性があるからだ。

 
ある人は42品目、ある人は6品目、ある人は30品目。問答無用で中身がアレなのは想像に難くありません
 
TheXpert:
ある人は42品目、ある人は6品目、ある人は30品目。こんな問答で、中にどんなアホがいるのか想像するのが怖い

愚問とは、聞かれざる質問のことである。

私はいくつかの解決策を持っていますが、より良い解決策を探し、他の人から学ぶことを続けています。

 
1つだけでよかった :) ...商品とソリューションの選択肢を1つずつ提供します。
理由: