0

ここに私が持っているものがあります:

int t[MX];

ここで、コードの残りの部分ですべてのインデックスを 1 で変換することなく、その配列の先頭に 1 つの要素を効果的に追加できるように、そのコードを書き直したいと思います。その問題の解決策は、次のようなものかもしれません。

int _t[MX+1];
int * const t = _t+1;

このアプローチの問題は、次のようなものが機能しなくなったことです。

memset(t, 0, sizeof t);

問題は、sizeof t私が望んでいた MX*4 ではなく、4 を返すことです。

考えられる解決策の 1 つとして、次のようなものがあります。

struct
{
    int a;
    int b[MX];
} _t;
int (&t)[MX] = _t.b;

しかし、私はそれがかなり非エレガントで不十分だと思います。だから、私の質問は次のようになります: より良い方法はありますか?

4

1 に答える 1

0

2 番目の解決策は「洗練されておらず満足できない」だけでなく、未定義の動作でもあります。このトピックの詳細については、この質問への回答を参照してください。

最初の解決策では、負のインデックスを使用できます。これptr[index]は と同等*(ptr + index)であるため、結果が配列内を指している限り問題ありません。

sizeofの設計者が採用したアプローチに従うことで、問題の解決策を構築できますstd::array<T,size_t>。配列をラップするテンプレート クラスを作成し、添字演算子内でインデックス変換を行います。

これが機能しない場合は、元の 2 つのソリューションの組み合わせに戻ることができますが、次のように未定義の動作はありません。

#define MX 1000

typedef int arr_mx[MX];

int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));

これは ideone でのこのアプローチのデモです。

于 2013-05-17T13:39:29.447 に答える