int ArrayDeleteVal(int &a[],constint val) // вариант Semko
{
int size=ArraySize(a);
int i=0,start,s,count;
while(i<size && a[i]!=val) i++; // ищем первый элемент массива со значением valif(i==size) return size;
start=i; i++;
while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным valif(i==size) {ArrayResize(a,0); return0;}
s=i; i++;
while(true)
{
while(i<size && a[i]!=val) i++; // ищем элемент массива со значением val
count=i-s;
if(count>6) { ArrayCopy(a,a,start,s,count); start+=count;} // если нужно скопировать более 6 элементов, то имеет смысл воспользоваться ArrayCopyelsefor(; s<i; start++,s++) a[start]=a[s]; // иначе простой циклif(i==size) break;
i++;
while(i<size && a[i]==val) i++; // ищем элемент массива со значением, не равным valif(i<size) s=i; elsebreak;
i++;
}
if(start<size) ArrayResize(a,start); else start=size;
return(start);
}
2018.11.1310:07:27.757 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 156757 микросекунд
2018.11.1310:07:27.761 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 2338 микросекунд
2018.11.1310:07:27.764 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 1839 микросекунд
2018.11.1310:07:27.766 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 782 микросекунд
2018.11.1310:07:27.770 ArrayDeleteValue (EURUSD,D1) вариант Pavlov: Контрольная сумма = 495781718; элементов - 999026; время выполнения = 2886 микросекунд
2018.11.1310:07:27.773 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 495782577; элементов - 999027; время выполнения = 2355 микросекунд
for(int i=0; i<1000000;i++) arr[i]=rand()%3;// 1000; //генерируем исходный массив случайными значениями от 0 до 1000int Value=rand()%3; // 1000; // значение, которое нужно удалить из массива
その結果、こうなったのです。
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Pastushak: Checkum = 333586; elements - 667421; execution time = 108521 microseconds 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Korotky: Checkum = 333586; elements - 667421; execution time = 5525 microseconds 2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Fedoseev: Checkum = 333586; elements - 667421; execution time = 4879 microseconds 2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variant Semko: Checkum = 333586; elements - 667421; execution time = 14479 microseconds 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Pavlov: Checkum = 998744; elements - 667421; execution time = 0 microseconds 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Nikitin: Checkum = 333586; elements - 667421; execution time = 5759 microseconds 2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Vladimir: Checkum = 333586; elements - 667421; execution time = 1542 microseconds
2018.11.1312:35:38.633 ArrayDeleteValue (EURUSD,D1) вариант Pastushak: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 131964 микросекунд
2018.11.1312:35:38.636 ArrayDeleteValue (EURUSD,D1) вариант Korotky: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2310 микросекунд
2018.11.1312:35:38.639 ArrayDeleteValue (EURUSD,D1) вариант Fedoseev: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 1834 микросекунд
2018.11.1312:35:38.641 ArrayDeleteValue (EURUSD,D1) вариант Semko: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 773 микросекунд
2018.11.1312:35:38.645 ArrayDeleteValue (EURUSD,D1) вариант Pavlov: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2815 микросекунд
2018.11.1312:35:38.648 ArrayDeleteValue (EURUSD,D1) вариант Nikitin: Контрольная сумма = 496494849; элементов - 999011; время выполнения = 2475 микросекунд
2018.11.1312:35:38.653 ArrayDeleteValue (EURUSD,D1) вариант Vladimir: Контрольная сумма = 496656342; элементов - 999011; время выполнения = 3608 микросекунд
mt4ってなんだよwin10でも動かんぞww
配列をいじってみました。
MQL5では配列が静的で あることを誓ったので、ArrayCopyを 使わなければなりませんでした。
![](https://c.mql5.com/3/250/x6hfo6_relrn0_h_2018-11-13_15-55-46.png)
そんなスピード勝負なら、私なりのバリエーションを提案しますよ...。
もし配列の すべての要素がフィルタと等しい場合、この関数は配列を終了します。
私自身のバリエーションを提供します、それはあなたより少し遅いです。
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090
2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1)テスト alien=1464941
数年前からこのような質問をしていますね。多くを学びましたか?申し訳ありませんが、まだバイトや初歩的な配列の レベルであることは明らかです。
設問自体の定式化が間違っている。有効な項目のリストを更新しているようなので、繰り返される値を削除する(一般的な国家試験レベルのタスク)のではなく、もっと大きなものにおいてです。もしそうなら、質問の内容はまったく違って聞こえるはずです。参加者、そしてまず自分自身を混乱させ、誤解させる。原理的に間違った解決策を参加者に押し付け、それを有効にするように求める。
私はプログラミングのためにプログラミングをしているわけではありませんし、メガプログラマーになることやフォーラムで賢くなることを目標にしているわけではありません。
定義された要素の配列をクリアする、という質問のどこがわからないのでしょうか?
もし配列の すべての要素がフィルタと等しい場合、この関数は配列を終了します。
私のバリエーションを提案します、あなたのより少し遅いです。
2018.11.13 17:16:38.618 massiv v1 (EURUSD,M1) test my=1512090
2018.11.13 17:16:40.083 massiv v1 (EURUSD,M1)テスト alien=1464941
はい、ありがとうございます。修正しました。
ただ、どこかに1つ要素が欠けているためにチェックサムが一致しないので、あなたもどこかでエラーになっているのです。どこをどうしたらいいのかわからなかった。
不要なパッセージを削除して微調整
いずれの場合も、各要素は最大1回までドラッグされる。
はい、すみません、確かに1回だけです。 DBMSのアプローチに興味を持ってチェックしてくれる人がいると期待していたのですが、待ちきれませんでした。自分でやるしかなかった。
ArrayDeleteValue.mq5を あなたのチェッカーに挿入したところ、あなたのチェッカーより2倍悪いです。理由を考えて、0.1%ではなく、3分の1の項目が削除されるように、その中の2行を修正しました。
その結果、こうなったのです。
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Pastushak: Checkum = 333586; elements - 667421; execution time = 108521 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Korotky: Checkum = 333586; elements - 667421; execution time = 5525 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Fedoseev: Checkum = 333586; elements - 667421; execution time = 4879 microseconds
2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variant Semko: Checkum = 333586; elements - 667421; execution time = 14479 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Pavlov: Checkum = 998744; elements - 667421; execution time = 0 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Nikitin: Checkum = 333586; elements - 667421; execution time = 5759 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Vladimir: Checkum = 333586; elements - 667421; execution time = 1542 microseconds
Pavlovの変種はエラーがあったので、コメントアウトしておきました。
結論:配列内のアドレスをその番号の間に任意の距離を置いて計算することは、与えられたステップ、ましてやステップ1では、コンパイラはそれを最適化することができ、行の要素を処理するよりもまだ悪いです。
追伸:BorlandのPascalとDelphiのコンパイラは、実行時にループ変数は(メモリ上では)関係なく、CPUのレジスタのどこかに置かれるようになっています。
はい、すみません、確かに1回だけです。 DBMSのアプローチに興味を持ってチェックしてくれる人がいると期待していたのですが、待ちきれませんでした。自分でやるしかなかった。
ArrayDeleteValue.mq5を あなたのチェッカーに挿入したところ、あなたのチェッカーより2倍悪いです。その理由を考え、0.1%ではなく3分の1が削除されるように2行を修正したのです。
その結果、こうなったのです。
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Pastushak: Checkum = 333586; elements - 667421; execution time = 108521 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Korotky: Checkum = 333586; elements - 667421; execution time = 5525 microseconds
2018.11.13 19:45:22.148 Del (GBPUSD.m,H1) variant Fedoseev: Checkum = 333586; elements - 667421; execution time = 4879 microseconds
2018.11.13 19:45:22.164 Del (GBPUSD.m,H1) variant Semko: Checkum = 333586; elements - 667421; execution time =14479 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Pavlov: Checkum = 998744; elements - 667421; execution time = 0 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Nikitin: Checkum = 333586; elements - 667421; execution time = 5759 microseconds
2018.11.13 19:45:22.179 Del (GBPUSD.m,H1) variant Vladimir: Checkum = 333586; elements - 667421; execution time = 1542 microseconds
Pavlovの変種はエラーがあったので、コメントアウトしておきました。
結論:配列内のアドレスをその番号の間に任意の距離を置いて計算することは、与えられたステップで行のアイテムを処理するよりもまだ悪く、ステップ1ではコンパイラが最適化できるため、なおさらそうです。
追伸:BorlandのPascalとDelphiのコンパイラは、実行時にループ変数は(メモリ上では)関係なく、CPUのレジスタのどこかに置かれるようになっています。
パブロフ版を修正しました。
あなたの価値観はおかしい。プロファイリングやデバッガを実行した後、コードを再コンパイルせずにスクリプトを実行したのではありませんか?
私の場合は、そういうことなんです。
そして、あなたのバージョンでは、不正なチェックサムが生成されます。また、アレイを追加で作成しても全くメリットがなく、それどころか処理が遅くなり、追加のリソースを食ってしまいます。
ただ、私の場合はArrayCopyを使って ブロック単位で行っているので、スピード的には有利です。