4

C ++で動的配列(JavaのArrayListやVectorのようなもの)を使用したいのです
が、この例では、t1、t2 ...オブジェクトがコピーされますか、それともそのアドレスのみがベクトルに追加されますか?
Nodeクラスのコピーコンストラクターを実装する必要がありますか、それともデフォルトのコンストラクターが「適切な」コピーを作成しますか(クラスにポインターがあるため)?または、コピーを避けるために、これの代わりに
宣言する必要がありますか? そして、ポインタを削除するためにデストラクタを実装する必要がありますか、それともプログラムによって使用され、まだ格納されている可能性がありますか?vector<Node*>
other_nodevector

#include <vector>

using namespace std;

class Node {
public:
    int id;
    Node* other_node;
};

int main(int argc, char** argv) {
    vector<Node> nodes;
    Node t1;
    t1.id = 0;
    t1.other_node = NULL;
    Node t2;
    t2.id = 1;
    t2.other_node = &t1;
    Node t3;
    t3.id = 2;
    t3.other_node = &t2;
    Node t4;
    t4.id = 3;
    t4.other_node = &t1;
    nodes.push_back(t1);
    nodes.push_back(t2);
    nodes.push_back(t3);
    nodes.push_back(t4);
    for (vector<Node>::iterator it = nodes.begin(); it != nodes.end(); it++) {
        if (it->other_node) {
            printf("%d (other.id: %d)\n", it->id, it->other_node->id);
        } else {
            printf("%d (other.id: NULL)\n", it->id);
        }
    }
    getchar();
    return 0;
}
4

2 に答える 2

4

あなたの例vector<Node>では、ノードのコピーを保存するのでt1t2がコピーされます。

また、のデフォルトのコピーコンストラクタNodeは「浅い」コピーを作成します。したがって

Node* head = new Node();
Node* next = new Node();
head->other_node = next;
Node* other_head = new Node(*head);

*(other_head->other_node)それが*(head->other_node)あなたが望む振る舞いであるかどうかを決めるのはあなた次第です。

デストラクタについて:メモリの所有権を取得するやむを得ない理由がない限り、クラスインスタンスが割り当てたメモリのみを削除/解放する必要があります。リストの場合、一般に、リストはother_nodeそれが指すメモリを割り当てていないため、削除しないでください。

パフォーマンスの面では、ノードのコピーはかなり安価であるため(intとポインター)、コピーの保存は問題ありません。Nodeクラスがディープコピーを実行した場合は、パフォーマンスの観点から使用する方が適切です。vector<Node*>

于 2010-07-23T22:23:22.590 に答える
2

std::vector他のC++標準ライブラリコンテナには値のセマンティクスがあります。つまり、オブジェクトへのポインタではなく、実際のオブジェクトを保持することを期待しています。したがって、オブジェクトを標準ライブラリコンテナに入れると、コンテナはそれをコピーします。値のセマンティクスには、コンテナがオブジェクトへのポインタを保持している場合にメモリリークが発生する、コンテナの破棄時の自動クリーンアップなどの特定の影響があります。その特定のケースでは、ポイントされたオブジェクトを自分で手動で削除する必要があります。

コピーが安価またはコピーが高価であるが頻繁にはコピーされないオブジェクトがある場合は、それらを値としてコンテナーに入れることをお勧めします。コンテナにポリモーフィックオブジェクトを保持する必要がある場合、または頻繁にコピーされ、オブジェクトをコピーするにはコストがかかる場合は、を使用するboost::shared_ptr<>か、のような適切なboost::ptr_xxxコンテナを使用して、コンテナに保持しますboost::ptr_vector

于 2010-07-23T23:14:55.223 に答える