清除一个定义元素的数组 - 页 5

 
Konstantin Nikitin:
纯粹是为了手头的任务。删除值和空

添加一个函数,这样你就可以按标准进行过滤,你就可以开始了。你甚至可以把它加入到你的收藏中 :-)

类似于

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(),考虑到被擦除的值的数量。

Zy。不要移动你要删除的数值。你可以将所有的数值移到左边,除了你擦除的数值。

向左移动的数值应等于被擦除的单元格的数量。

 
Vladimir Pastushak:

一个愚蠢的问题就是一个没有被问到的问题。

我有几个解决问题的办法,但我一直在寻找更好的解决办法,并向别人学习。

几年来,你一直在问类似的问题。你学到了很多吗?对不起,但你似乎还停留在字节和基本 数组的水平上。

这个问题本身的表述是不正确的。任务不是删除重复的值(一般国家考试级别的任务),而是在更大的事情上,因为你似乎在更新有效项目的列表。如果是这样,这个问题听起来应该完全不同。你混淆和误导了参与者,首先是你自己:在原则上把错误的解决方案强加给参与者,并要求使其有效。

 
Реter Konow:

通过在数组中循环,并从其中删除不需要的值,覆盖下一个单元格中的值,以取代删除的值。将被擦除的值之后的所有数值向左移动,并在计数器中计算被擦除的数值的数量。

然后做ArrayResize(),考虑到被擦除的值的数量。

Zy。不要移动你想删除的数值。你可以将所有的数值移到左边,除了你擦除的数值。

向左移动的数值应等于被擦除的单元格的数量。

 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:

对不起。看起来线条需要颠倒过来。

谜语 如果皮诺曹给了他两个苹果,而卡罗爸爸给了他三个,那么皮诺曹会有多少个苹果?
答案: 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);