对于一个非常具体的应用程序,我想使用一个容器,其中包含可变大小和连续内存的元素。理由是访问将主要是顺序访问,因此将所有数据放在同一个线性数据结构中应该有助于缓存行为。
当然,随机访问是不可能的,但数据结构应使用矢量样push_back
方法动态调整大小。
这样的容器存在吗?怎么称呼?
编辑以解决Arne Mertz的评论:
我想要表示的结构是图表。容器将包含节点列表,每个节点具有边缘列表,可能表示为指向其他(先前)节点的指针列表。
struct Node {
//various fixed size fields about the node itself
...
unsigned short n_edges;
Node * edges[n_edges]; // schematically
};
答案 0 :(得分:1)
您可以创建一个与std::vector<char> v
相结合的std::list<size_t> l
。 v
将充当可增长的字符缓冲区,l
将包含对象的偏移量。
现在您需要编写自己的push_back,将当前偏移量插入到std :: list中并将对象复制到位置:&amp; v [offset](记得事先增加v)。
template <class T>
void push_back(T t)
{
size_t vectorSize = v.size());
size_t objectSize = sizeof(T);
l.pushback(vectorSize);
v.reserve(vectorSize + objectSize);
st::memcpy(&v[vectorSize], &t, objectSize);
}
答案 1 :(得分:1)
解决此问题的一种方法是使用内部void指针。然后,每个元素都存储在该存储器中。每个元素都以其大小开头。迭代容器会使字节指针增加当前元素的大小。如果要随机访问,可以使用包含指向所有元素的指针的目录。
答案 2 :(得分:1)
Boost Intrusive singly linked list怎么样?您需要自己实现自己的分配。您可以简单地分配一个大区域(char []类型)并使用增加的地址在此区域内创建对象(不要忘记对齐)。如果您的区域已满,您可以简单地再创建一个区域。但是你必须为自己的所有分配和管理对象的生命周期。此外,您可以使用std::vector
作为O(1)访问的支持结构。
答案 3 :(得分:0)
使用一大块动态内存实现一个类。 编写一个函数来在块的末尾推送一个可变长度的结构。 将块的偏移量放在向量中,以便您轻松迭代块, 和随机访问块。
当动态内存区域变满时,重新分配它并将旧的块数据复制到其中。
冲洗重复。