定義された要素の配列をクリアする。 - ページ 5

 
Konstantin Nikitin:
純粋に目の前の課題に取り組む値を削除して空にする

を追加して、基準でフィルタリングできるようにすればOKです。あなたのコレクションに加えることもできますよ :-)

みたいなもの

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

で、3より大きい値をすべて取り出すには、 arrayFilter<long>(array,3,GreaterThen<long>) とします。

MQLのテンプレートで簡単にできるようになるのかどうか

 
TheXpert:

堂々としているわけではない。

ありがとうございます、今日は優しいですね :-)

タスクについてCArrayDoubleの ようなデータコレクションからの型を使って操作する方が便利だと思います。私の例です。

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

しかし、欠点もあります。出力はソートされた配列になります。

 
Denis Kirichenko:
ああ、時には黙ってバカを見たほうが......。
 
TheXpert:
ああ、時には黙ってバカを見たほうが......。

何も言わずに疑問を解消するよりも...。

 
Vladimir Pastushak:

1,2,3,6,9,5,6,3,25,6,8,7,4 型のデータセットを含む配列があり、例えば値 3 を削除して、出力に 3 と空白のない同じ配列を得る必要があります。

不要な値の配列を最速でクリアする方法を探しているのですが・・・。

次のような例が思い浮かびます。

もしかしたら、もっと経済的で早い方法があるのでは?

配列をループして不要な値を削除することで、削除された値の代わりに次のセルの値を上書きします。消去した値の次の値をすべて左にシフト し、カウンタで消去した値の数を数える。

その後、消去された値の数を考慮してArrayResize()を実行する。

ザイ。消したい値を動かさないでください。消去する値以外のすべての値を左にシフトすることができます。

値の左シフトは、消去されたセルの数と同じでなければならない。

 
Vladimir Pastushak:

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

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

数年前から似たような質問をしていますね。多くを学びましたか?申し訳ありませんが、あなたはバイトや初歩的な配列の レベルにとどまっているようです。

設問自体の定式化が間違っている。タスクは、繰り返される値を削除すること(GCEレベルのタスク)ではなく、もっと大きなもので、有効な項目のリストを更新する必要があるのです。もしそうなら、質問の内容はまったく違って聞こえるはずです。参加者と、まず自分自身を混乱させ、誤解させる。原理的に間違った解決策を参加者に押し付け、それを有効にするように求める。

 
Реter Konow:

配列をループして不要な値を削除することで、削除した値の代わりに次のセルの値を上書きします。消去した値の次の値をすべて左にシフト し、カウンタで消去した値の数を数える。

その後、消去された値の数を考慮してArrayResize()を実行する。

ザイ。消したい値を動かさないでください。消去する値以外のすべての値を左にシフトすることができます。

値の左シフトは、消去されたセルの数と同じでなければならない。

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

このオプションにチェックを入れます。

 

すみません。線を逆にする必要があるようです。


 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:

すみません。線を逆にする必要があるようです。

なぞなぞ: ピノキオがリンゴを2個、パパ・カルロが3個あげると、ピノキオは何個のリンゴを持つことになる?
答え: 10ソース変数は初期化する必要があります。

 
Реter Konow:

すみません。線を逆にする必要があるようです。


もっとやるべきことがある。

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