STL <list>正确生成和删除项目

0 c++ lambda stl bind list

  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;
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 7

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

class Stack {
    public:
    list<Layer> layer;
    list<Layer>::iterator iter;
};
Run Code Online (Sandbox Code Playgroud)

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

Stack stack;
stack.layer.push_back(Layer("snail", true));
stack.layer.push_back(Layer("squirrel", false));
Run Code Online (Sandbox Code Playgroud)

如果你有一个新的编译器不够,你可能要替换push_back使用emplace_back,虽然.

对于这样的事情,lambda几乎肯定比std::bind以下更好:

stack.layer.remove_if([](Layer const &s) { return s.isName(search); }
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您可能还希望更改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; }
};
Run Code Online (Sandbox Code Playgroud)

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

 stack.layer.remove(search);
Run Code Online (Sandbox Code Playgroud)