0
  1. 我想知道,如果用这个概念正确删除了用“new”生成的对象。
  2. 我没有使用“bind”而不是“bind2nd”。我该怎么做呢?
  3. 最后一个问题:我如何使用 lambda 项而不是命名函数来做同样的事情?

为什么我使用列表?我决定使用列表而不是向量,因为我的对象没有排序。最后,我想为面向对象带来一些“瀑布式”代码,主要是因为性能问题(你会在这里看到问题),所以我需要一个概念,我可以快速访问容器层次结构中的对象和让他们互相交流,也很快。也许想想模块化合成器。

class Layer {
    private:
    string name;
    bool active;
    public:
    Layer();
    Layer(string m_name, bool m_active);
    bool isName(string m_name);
};

// ... constructors

bool Layer::isName(string m_name) {
return name == m_name;
}

class Stack {
    public:
    list<Layer*> layer;
    list<Layer*>::iterator iter;
};

int main() {
Stack stack;
stack.layer.push_back(new Layer);
stack.layer.push_back(new Layer("snail", true));
stack.layer.push_back(new Layer("squirrel", false));

string search = "snail";
stack.layer.remove_if(bind2nd(mem_fun(&Layer::isName), search));

return 0;
}
4

1 回答 1

7

不,您没有正确管理内存。除非您需要这样做,否则我会从代码中删除大部分(如果不是全部)指针:

class Stack {
    public:
    list<Layer> layer;
    list<Layer>::iterator iter;
};

然后内存管理变得非常自动化:

Stack stack;
stack.layer.push_back(Layer("snail", true));
stack.layer.push_back(Layer("squirrel", false));

如果你有一个足够新的编译器,你可能想要替换push_backemplace_back

对于这样的事情,一个 lambda 几乎肯定比std::bind

stack.layer.remove_if([](Layer const &s) { return s.isName(search); }

顺便说一句,您可能还想更改isName为引用 const 字符串而不是字符串(保存每次调用都复制字符串)。

从您所展示的内容来看,我也会考虑使用std::map而不是std:list. 它将更直接地支持查找(一方面)。

编辑:我应该提到的另一点是,在这种情况下,您几乎可以肯定会一直使用一个字段作为“键”(在这种情况下是名称),您可能想要重载operator<, operator==,等,在该关键领域工作:

class Layer { 
    // ...
    bool operator<(Layer const &other) { return name < other.name; }
    bool operator==(Layer const &other) { return name == other.name; }
};

有了这个,排序,删除等操作变得更加简单。上面的变成了:

 stack.layer.remove(search);
于 2012-06-08T21:57:16.480 回答