C ++“vector”,包含可变大小的元素

时间:2013-06-19 08:51:18

标签: c++ boost data-structures stl containers

对于一个非常具体的应用程序,我想使用一个容器,其中包含可变大小和连续内存的元素。理由是访问将主要是顺序访问,因此将所有数据放在同一个线性数据结构中应该有助于缓存行为。

当然,随机访问是不可能的,但数据结构应使用矢量样push_back方法动态调整大小。

这样的容器存在吗?怎么称呼?

编辑以解决Arne Mertz的评论:

我想要表示的结构是图表。容器将包含节点列表,每个节点具有边缘列表,可能表示为指向其他(先前)节点的指针列表。

struct Node {
  //various fixed size fields about the node itself
  ...

  unsigned short n_edges;
  Node * edges[n_edges]; // schematically
};

4 个答案:

答案 0 :(得分:1)

您可以创建一个与std::vector<char> v相结合的std::list<size_t> lv将充当可增长的字符缓冲区,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)

使用一大块动态内存实现一个类。 编写一个函数来在块的末尾推送一个可变长度的结构。 将块的偏移量放在向量中,以便您轻松迭代块, 和随机访问块。

当动态内存区域变满时,重新分配它并将旧的块数据复制到其中。

冲洗重复。