0

このような構造体が与えられた場合、どうすれば展開可能な (ベクトル) 配列を作成できますか?

struct IntArray {
   int size;
   int capacity;
   int *contents;
};

int *contents を使用して整数の配列を指し、IntArray が展開するときにポインターを変更することを考えていましたが、整数の初期配列を作成するサイズをどのように知ることができますか?

4

1 に答える 1

1

@aaronmanが言ったように、最終的な解決策を提供しただけでは、あなたにとっては良くありません。何かを学びたい場合は、自分でこれをゼロから試したほうがよいでしょう(そうでない場合は、既存のベクトルまたは任意のベクトルを使用してstd::vectorくださいQVector) .

代わりに、インスピレーションを得るためにいくつかのチュートリアルまたはいくつかの例を参照してから、ゼロから始めることをお勧めします。動的配列を実装する C++ チュートリアルの単純な Google 検索でも、このような許容できるビデオとテキスト リンクがいくつか表示されます。

実装の詳細が明確になったら、配列のインターフェイスを設計することをお勧めします。考慮すべき点は次のとおりです。

  1. デフォルトでフィールドを非公開にするclass代わりに、これをにします (カプセル化) 。struct
  2. コンストラクターで初期割り当てを実装し、デストラクターで割り当て解除を実装します ( @juanchopanzaのコメントを参照)。コピー コンストラクターと代入演算子も適切ですが、この時点では IMHO を省略できます(たとえば、コピーを単に禁止するために、実装せずにプライベートにすることができます)。
  3. すべての機能をメソッドとして実装します。たとえば、メソッドpush_backを最後に追加することができます。要素を追加すると再割り当てが発生する可能性があることがわかるので、再割り当てプロセスを別の (おそらくプライベートな) メソッドに抽出して (再利用可能にするために)、そのビデオのアイデアを使用して実装し、push_backifから呼び出すことをお勧めしsize == capacityます。
  4. 演算子のオーバーロードについて学び、operator[] を実装して、通常の配列と同じように要素にアクセスできるようにします。
  5. ...実装を楽しむまで機能を追加し続けます:) きちんとしたものを作成することから楽しむことを学ぶとき、私は重要だと思います。

最後に、実装をstd::vectorまたは他の既存の動的配列と比較して、何かが欠けているかどうかを確認できます。約 3 年前、卒業証書の作業で vector を独自に実装する必要がありました(パフォーマンス上の理由から、変更と再割り当てをきめ細かく制御するため)。チェックアウトすることもできますが、 (免責事項!)ちょっと複雑だと感じるかもしれません。最適化のすべての試みの後、面倒です:)

どうぞ!これが役に立てば幸いです(そして少し刺激を受けます)。

于 2013-10-11T07:01:22.077 に答える