C++ STL<;列表>;正确生成和删除项目 我想知道,用“new”生成的对象是否用这个概念正确地删除了 我没有用“bind”代替“bind2nd”。我该怎么做 最后一个问题:如何对lambda项而不是命名函数执行相同的操作

C++ STL<;列表>;正确生成和删除项目 我想知道,用“new”生成的对象是否用这个概念正确地删除了 我没有用“bind”代替“bind2nd”。我该怎么做 最后一个问题:如何对lambda项而不是命名函数执行相同的操作,c++,list,stl,lambda,bind,C++,List,Stl,Lambda,Bind,为什么我要使用列表?我决定使用列表而不是向量,因为我的对象没有排序。最后,我想将一些“瀑布式”代码引入面向对象,基本上是因为性能问题(你会看到问题),所以我需要一个概念,在这个概念中,我可以快速访问容器层次结构中的对象,并让它们相互通信,而且速度也很快。也许可以考虑一个模块化合成器 class Layer { private: string name; bool active; public: Layer(); Layer(string m_nam

为什么我要使用列表?我决定使用列表而不是向量,因为我的对象没有排序。最后,我想将一些“瀑布式”代码引入面向对象,基本上是因为性能问题(你会看到问题),所以我需要一个概念,在这个概念中,我可以快速访问容器层次结构中的对象,并让它们相互通信,而且速度也很快。也许可以考虑一个模块化合成器

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;
}
类层{
私人:
字符串名;
布尔活跃;
公众:
层();
图层(字符串m_名称,布尔m_活动);
bool isName(字符串m_name);
};
// ... 建设者
bool Layer::isName(字符串m_name){
返回名称==m_名称;
}
类堆栈{
公众:
列表层;
迭代器iter;
};
int main(){
堆叠;
堆栈。层。推回(新层);
stack.layer.push_back(新层(“snail”,true));
stack.layer.push_back(新层(“squirrel”,false));
字符串搜索=“蜗牛”;
stack.layer.remove_if(bind2nd(mem_-fun(&layer::isName),search));
返回0;
}

不,您没有正确管理内存。除非您需要执行其他操作,否则我将从代码中删除大部分(如果不是全部)指针:

class Stack {
    public:
    list<Layer> layer;
    list<Layer>::iterator iter;
};
如果你有一个足够新的编译器,你可能想用
emplace\u back
替换
push\u back

对于这种情况,lambda几乎肯定比std::bind好:

stack.layer.remove_if([](Layer const &s) { return s.isName(search); }
另外,您可能还希望更改
isName
,以引用常量字符串而不是字符串(保存每次调用时复制字符串)

从您所展示的,我也会考虑使用<代码> STD::MAP<代码>,而不是<代码> STD:List< <代码>。它将更直接地支持查找(一方面)

编辑:我应该提到的另一点是,在这样的情况下,几乎可以肯定有一个字段一直用作“键”(本例中的名称),您可能需要重载
运算符
stack.layer.remove_if([](Layer const &s) { return s.isName(search); }
class Layer { 
    // ...
    bool operator<(Layer const &other) { return name < other.name; }
    bool operator==(Layer const &other) { return name == other.name; }
};
 stack.layer.remove(search);