0

以下のコードは、私が動的メモリ管理で書いたゲームのものです。ゲーム内のすべてのガジェットへのポインターを含む「all_gadgets」という静的ベクターがあります。実行時にガジェットが削除されたときに、対応するポインターを静的ベクターから削除したいと考えています。私はこれを試しました:

Gadget::~Gadget(){
    int i = Gadget::all_gadgets.size();
    for (std::vector<Gadget *>::iterator it = Gadget::all_gadgets.begin(); it!=all_gadgets.end(); ++it){

        if ((*it)==this){
            Gadget::all_gadgets.erase(it);

            break;
        }
    }


    int j = (i - Gadget::all_gadgets.size());
    if(j!=1)
        std::cout << j << " ooops! Gadget not deleted!!" << std::endl;
}

上記のコードでは、 j はゼロになります:(理由はありますか?

ポインターを null に設定することはできません。VC10を使用しています。

4

1 に答える 1

2

これには侵襲的な二重リンクリストを使用してください。挿入、削除、および順序どおりの反復がより効率的になります。

通常、連結リストは局所性に問題があります。しかし、ポインターのベクトルを使用すると、ポインター自体は優れた局所性で格納される可能性がありますが、コンテンツには余分なレベルの間接性が必要であり、局所性が失われます。

侵襲的なリンク リストでは、ローカリティはコンテンツのローカリティとまったく同じです。したがって、ローカリティの理論的な上限に加えて、安価な挿入と削除を実現できます。


実際の問題は、すべてのコンストラクターに対して挿入を行わないことから発生する可能性があります。コンパイラは、デフォルトでコピー コンストラクター (および C++11 ではムーブ コンストラクター) を生成します。これはall_gadgets、独自のコンストラクターを提供しない限り、リストを更新しません。

于 2012-04-18T14:25:40.680 に答える