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);