c++ - 按标识从列表中删除对象

标签 c++

在下面的示例中,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/

相关文章:

c# - 在 C++ dll 中分配内存,在 C# 中释放

c++ - 在不声明成员变量的情况下更改按钮颜色

c++ - 在 OpenGL 中帮助相机

c++ 继承,构造函数真正的调用者

c++ - 如何使用 Boost.Spirit.Qi 增量解析(并作用于)大文件?

c++ - 什么决定了 C++ 中何时为临时对象调用析构函数?

c++ - 为什么我需要使用 CGAL 和 CMake 构建我的 C++ 程序?

c++ - 使用 OpenSSL 将 P1363 编码签名转换为 ECDSA_SIG

c++ - windows下Qt5 QSlider调色板无效果

java - Linux 系统上的 Windows DLL