0

私はポインターに比較的慣れていないため、このマージ関数を作成しました。これはポインターの効果的な使用ですか?第二に、*two変数はマージされたときに削除されるべきではありませんか?それは実装者ではなく、クライアントの仕事でしょうか?

VectorPQueue *VectorPQueue::merge(VectorPQueue *one, VectorPQueue *two) {
int twoSize = two->size();

if (one->size() != 0) {
    for (int i = 0; i < twoSize;i++)
    {
        one->enqueue(two->extractMin());
    }
}
return one;

}

スワップ関数は次のように呼び出されます

one->merge(one, two);

これら 2 つのオブジェクトを渡してマージする

PQueue *one = PQueue::createPQueue(PQueue::UnsortedVector);
PQueue *two = PQueue::createPQueue(PQueue::UnsortedVector);
4

2 に答える 2

4

あなたの場合、ポインターは完全に不要です。単に参照を使用できます。

また、メンバー関数が呼び出される引数を渡す必要もありません。thisポインタでメンバ関数が呼び出されたオブジェクトを取得できます。

/// Merge this with other.
void VectorPQueue::merge(VectorPQueue& other) {
  // impl
}

一般的に:継承を使用してコンテナーを実装することは、実際には推奨されるスタイルではありません。標準ライブラリと、シーケンスに対する抽象化 (イテレータ) の実装方法を確認してください。

于 2013-01-11T20:15:00.233 に答える
1

一見すると、ポインタ関連の問題は見当たりません。代わりに参照を使用しmerge、メンバー関数を作成することをお勧めしVectorPQueueますが、最初の引数を渡す必要はありません (他の人が既に指摘したように)。私を混乱させるもう1つのことは、チェックですone->size() != 0-oneが空の場合、何が問題になりますか? のサイズのみに依存するため、以下のコードは に正しく挿入twoされます。onetwo

の削除についてtwo:

それは実装者ではなく、クライアントのタスクになります

インターフェースをどのように設計するかは、あなた次第です。しかし、関数はtwoの要素を に追加するだけなので、one削除すべきではないと思います。ところで、このメソッドのより良い名前は、addAllFrom()またはこのようなものだと思います。

一般的なポインタについて

スマート ポインターを調べてみることを強くお勧めします。これらは、メモリ管理の労力を軽減するための C++ での一般的な手法です。裸のポインターを使用し、新規/削除を介して手動で管理することは、非常にエラーが発生しやすく、強力な例外セーフにするのが難しく、メモリリークなどをほぼ確実に保証します。一方、スマートポインターは、含まれているポインターがなくなるとすぐに自動的に削除しますもう必要です。説明のために、C++ std lib にはauto_ptr(unique_ptrおよびshared_ptrコンパイラが C++ 11 をサポートしている場合) があります。次のように使用されます。

{ // Beginning of scope
std::auto_ptr<PQueue> one(PQueue::createPQueue(PQueue::UnsortedVector));

// Do some work with one...:
one->someFunction();
// ...

} // End of scope - one will automatically be deleted

個人的な経験則: スマート ポインターでラップされたポインターのみを使用します。次の場合にのみ、ヒープ割り当てオブジェクトのみを使用します。

  • それらは作成されたスコープよりも長く存続する必要があり、コピーはコストがかかりすぎます (幸いなことに、C++ 11 にはムーブ セマンティクスがあり、そのようなケースの多くが排除されます)。
  • それらの仮想関数を呼び出す必要があります

それ以外の場合は、スタックに割り当てられたオブジェクトと STL コンテナーをできるだけ使用するようにしています。

C++ を使い始めた場合、これは最初は大変に思えるかもしれません。スマート ポインターなどに取り掛かる前に、ポインターを完全に理解しようとすることはまったく問題ありません (必要な場合もあります)。ただし、後でデバッグするのに多くの時間を節約できます。の上。また、C++ に関する本を何冊か読むことをお勧めします。最初の本を読むまでは、実際には C++ のほとんどを理解していると思っていました :)

于 2013-01-11T20:17:17.440 に答える