为什么我使用列表?我决定采用列表而不是向量,因为我的对象没有排序.在最后,我想给面向对象带来一些"瀑布式"代码,主要是因为性能问题(你会在这里看到问题),所以我需要一个概念,我可以快速访问容器层次结构中的对象让他们彼此沟通,这也很快.也许想到模块化合成器.
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)
不,你没有正确管理内存.除非你不需要,否则我会从代码中删除大部分(如果不是全部)指针:
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)
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |