0
int * a;
a = new int[10];
cout << sizeof(a)/sizeof(int);

通常の配列を使用すると、答えは10になります。残念ながら、印刷されたラッキーナンバーは1でした。これは、 sizeof(int) が 4 で iszeof(*int) も 4 であるためです。どうすればこれを克服できますか? 私の場合、メモリにサイズを保持することは複雑なオプションです。コードを使用してサイズを取得するにはどうすればよいですか?

私の最善の推測は、配列を反復処理してその末尾を検索することです。末尾は 0 ですよね?助言がありますか?

- 編集

ベクトルについて私が恐れているのは、プッシュバック中に再割り当てされることです。要点はわかりました。メモリを割り当てることができます。構造を変更することはできませんが、コード全体が関連しています。答えてくれてありがとう、どうしようもないので、サイズをメモリに保存する方法を探すだけです。

私が尋ねたのは、どのような構造を使用するかでした。

4

3 に答える 3

7

単純。

std::vector<int>Orを使用しますstd::array<int, N>(ここNで、はコンパイル時定数です)。

コンパイル時の配列のサイズがわかっていて、実行時に拡張する必要がない場合は、を使用しますstd::array。それ以外の場合は使用しますstd::vector

これらはシーケンスコンテナsize()クラスと呼ばれ、コンテナ内の要素の数を返すと呼ばれるメンバー関数を定義します。サイズを知る必要があるときはいつでもそれを使うことができます。:-)

ドキュメントを読む:

を使用する場合、コンテナが保持する要素の数について漠然とした考えがある場合は、の使用std::vectorを検討する必要があります。reserve()それはあなたにパフォーマンス上の利益を与えるでしょう。

std::vectorvs raw-arraysのパフォーマンスが心配な場合は、ここで受け入れられている回答を読んでください。

問題のコードが遅い理由を説明しています。これは、それ自体とは関係std::vectorなく、誤った使用法です。


どちらも使用できず、強制的に使用する場合はint*、これら2つの方法をお勧めします。ニーズに合ったものを選択してください。

struct array
{
      int *elements;  //elements
      size_t size;    //number of elements
};

それは自明です。

2つ目は次のとおりです。もう1つの要素にメモリを割り当て、最初の要素のサイズを次のように格納します。

int N = howManyElements();
int *array = int new[N+1];  //allocate memory for size storage also!
array[0] = N; //store N in the first element!

//your code : iterate i=1 to i<=N 

//must delete it once done
delete []array;
于 2013-01-18T21:32:43.630 に答える
2

sizeof(a)割り当てられた配列のサイズではなく、ポインタのサイズになります。

割り当てた後、配列のサイズを取得する方法はありません。演算子は、sizeofコンパイル時に評価できる必要があります。

コンパイラは、この関数の配列の大きさをどのように知るのでしょうか。

void foo(int size)
{
    int * a;
    a = new int[size];
    cout << sizeof(a)/sizeof(int);
    delete[] a;
}

できませんでした。したがって、sizeofオペレーターが割り当てられた配列のサイズを返すことはできません。実際、で割り当てた配列のサイズを取得する信頼できる方法はありませんnew。これを繰り返しますが、で割り当てた配列のサイズを取得する信頼できる方法はありませんnew。サイズはどこかに保存する必要があります。

幸いなことに、この問題はすでに解決されており、C++のどの実装にも確実に存在します。配列とともにサイズを格納する優れた配列が必要な場合は、を使用します::std::vectornew特に、配列の割り当てに使用している場合。

#include <vector>

void foo(int size)
{
    ::std::vector<int> a(size);
    cout << a.size();
}

どうぞ。削除することを覚えておく必要がなくなったことに注目してください。さらに::std::vector、この方法で使用しても、以前の方法で使用した場合よりもパフォーマンスが低下することはありませんnew

于 2013-01-18T21:32:33.160 に答える
0

あなたが述べたように std::vector と std::array を使用できない場合、唯一の残りのオプションは、配列のサイズを自分で追跡することです。

std::vector を避ける理由が間違っているのではないかと思います。パフォーマンス監視ソフトウェアの場合でも、ベクターのインテリジェントな使用は合理的です。サイズ変更が心配な場合は、ベクトルを事前に十分な大きさに割り当てることができます。

于 2013-01-18T21:52:00.653 に答える