配列(1次元2次元)から要素を削除するにはどうすればよいですか? - ページ 7

 
Ilya Malev:


タスク:配列から要素を削除する。

 
Алексей Тарабанов:

タスク:配列から要素を削除する。

一次元か二次元か。タスクの答えが違うのは、両方で同じコードを作らないからです。というか、やってもいいのですが、配列の計測数をあらかじめ知っておかないと呼び出すことができません。あなたはプログラマーではないので、あなたの言葉から判断して、私はあなたがそれを信じることをお勧めします。

 
Dmitry Fedoseev:
ここでは、配列は4次元以上持つことができません。だから、4種類の機能を書けばそれで終わりです。

8次元のものは作れないのでしょうか?

 
Ilya Malev:

このように考えると、多次元配列は 一切宣言せず、異なるフィールドを持つ構造体の配列を使うべきということになります。しかし、問題はそれとは別に、すでに与えられたものとして存在する任意の(事前にわからない)次元の配列に対して何ができるのか

その時はデッドロックです :( .複数の機能を持つバリアントはいかがでしょうか?
 
Aliaksandr Hryshyn:
多機能オプションの何が気に入らないのでしょうか?

同じコード(あなたが言っているのと同じもの)を、パラメータ配列の次元が 異なるごとに異なる 名前を持つ関数で複製しなければならないことによって

 
Dmitry Fedoseev:
ここでは、配列は4次元以上にはならない。だから、4種類の機能を書けばそれで終わりです。

問題は4つの関数を書くことではなく、他の型と同じように、どの配列に対しても1つの関数を使えないことです。したがって、µlでは多次元配列(組み込み型[])の使用は一切避けた方が良い

 
Алексей Тарабанов:

8次元のものは作れないのでしょうか?

使いやすい構造になっています。

 
ところで、コンパイル時に利用可能なtypenameは、測定数だけでなく、パラメータが配列であるという事実さえも教えてくれません。sizeof==52で理解できますが、やはり、測定数については何も教えてくれません。ArrayCopyやArrayResizeのような、異なる次元の配列を 渡すことができる埋め込み呼び出しだけを使った関数コードをすべてdefineに押し込めることができない限り、このようなことはありません。
 
Dmitry Fedoseev:

え、しかもオーバーロードでは救われない。

このようにコンパイルされるのでしょうか?

void z(int & z[],int shift){}; 
void z(int size_second_dimension,int & z[][],int shift){};
正確には覚えて いませんが、2回目以降の測定はダイナミックに行えないようです。そのため、コンパイル時にエラーが発生する可能性があります。ここで、size_second_dimension 変数は、2次元目のサイズ設定として使用でき、関数のオーバーロードを 可能にする。さらに、ArrayRange()で次元を定義する必要がなくなります。
 
Alexey Viktorov:

このようにコンパイルされるのでしょうか?

正確には覚えて いませんが、2回目とその次の測定は、ダイナミックにできないようです。そのため、コンパイル時にエラーが発生する可能性があります。ここで size_second_dimension 変数は、2次元目の定義済みサイズとして使用でき、関数のオーバーロードを 可能にする。さらに、ArrayRange()で次元を定義する必要がなくなります。

コンパイルはされるけど、面白くないし、z[][]はどうするの?

2つ目以上の寸法は動的にはできませんが、2つ目の寸法の特定のサイズに対して関数をカスタマイズする必要はなく、ArrayRange()で知ることができます。

もし、測定値の数が関数をオーバーロードすることを許さないのであれば、2番目とその他の測定値のサイズは確実にオーバーロードしません。しかも、まったく普遍性がないので、おもしろくないんです。違う名前の関数を書く方が簡単でしょう。