在下面的示例中,std::list 存储 Resource 类型的对象(按值,而不是指向)。 Resource 类不提供小于比较或相等运算符。通过标识(又名内存地址)删除对象的好方法是什么。我能以某种方式避免 O(n) 吗? std::list 是正确的容器吗?
// Definition of the container
std::list<Resource> resources;
// Code
Resource *closedResource = resourceFromList();
for (std::list<Resource>::iterator it = resources.begin(); it != resources.end(); ++it)
{
if (closedResource == &*it)
{
resources.erase(it);
break;
}
}
编辑:假设 Resource 类实现移动语义。此外,资源通过一种选择器(cp.epoll 或 java.nio.Selector)为事件通知重新注册自己以进行任何“移动”。
最佳答案
您正在容器中存储 Resource
拷贝,因此稍后通过地址查找元素没有多大意义。
您可以做的是保存 list::iterator
,因为 list
具有这样的属性,即迭代器不会因任何操作而失效,除非明确删除该迭代器(或清除整个 列表
).
关于c++ - 按标识从列表中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6405506/