具有持久查找的线性内存容器
Linear Memory Container With Persistent Lookups?
我一直在网上寻找最能处理这种情况的容器:
-
线性内存(没有像对象池或分配器那样的间隙)
-
某种方法可以提供对容器中对象的引用,该对象在添加/删除之间保持不变。或者一种快速搜索以查找原始对象的方法。
-
相当快地添加到末端并从中间移除(但不需要插入)
到目前为止,我能够找到的唯一解决方案是使用std::vector
,当删除发生时,我会更新当前要删除的索引上方的所有引用索引。这似乎很糟糕,正在寻找任何其他更有效的解决方案。
这是一个可怕的想法。我根本没有尝试过,所以可能有很多错误。
template <typename T>
class InsaneContainter {
public:
class MemberPointer {
friend class InsaneContainer;
size_t idx_;
InsaneContainter* parent_;
public:
MemberPointer(InsaneContainter* parent,size_t idx) idx_(idx),parent_(parent){}
T& operator*() {
parent->members[idx_];
}
};
friend class MemberPointer;
using Handle = std::shared_ptr<MemberPointer>;
Handle insert(const T& t) {
members.push_back(std::make_tuple(T{t},Handle{new MemberPointer{this,members.size()}));
return std::get<1>(members.back());
}
Handle GetHandle(size_t idx) {
return std::get<1>(members[idx]);
}
void delete(size_t idx) {
//swap with end
std::swap(members[idx],members.back());
std::get<1>(members[idx])->idx_=idx;
members.pop_back();
}
private:
std::vector<std::tuple<T,std::shared_ptr<MemberPointer>> members_;
};
这个想法是,在插入时,您将收到一个始终具有 O(1) 查找和删除的句柄。虽然找到对象是其他的O(n),但一旦找到它,您就可以获得保持最新的句柄。
这种结构的用途是...至少可以说,所以我怀疑这里还有 X 与 Y 问题。
通过大量的性能测试,我找到了以下一般情况下最快的方法:
1.) 使用存储可用内存区域的池分配器。
2.) 使用可用内存区域列表将占用的数据线性复制到池中每个"间隙"的临时内存中。
由于我的程序中添加/删除的性质,这对我最有效(导致低碎片化)
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 查找自动生成键并具有线性内存消耗的小型关联数组
- CUDA 数组如何存储在 GPU 内存中?它们在物理上是线性的吗?
- C 接口到线性内存缓冲区
- 使用犰狳线性代数包存储矩阵需要多少内存
- 具有持久查找的线性内存容器
- 从cuda 3D内存复制到线性内存:复制的数据不是我所期望的