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 回答