用C ++对数组进行碎片整理

时间:2015-04-14 10:25:54

标签: c++ arrays defragmentation

我试图弄清楚如何做到这一点,但似乎无法绕过它。

我所拥有的是一个字符数组,其中包含一些字符串,包括每个字符串末尾的空值。

像这样:

Example

我希望能够整合所有数据并在最后有一大块可用空间,但我还需要在每个字符串的末尾保存null。

你会怎么做?

3 个答案:

答案 0 :(得分:0)

没有什么能阻止你一个接一个地复制所有字符串,包括空字符。您可以使用double null结束整个序列。 唯一的问题是,您将强制按顺序访问所有字符串。如果这是一个问题,您可以使用存储空间的开头创建一个指向所有字符串开头的指针数组。这一切都取决于你想做什么。

答案 1 :(得分:0)

将每个字符串'\ 0'逐个放入数组中,然后使用另一个数组保存每个'\ 0'的索引

答案 2 :(得分:0)

我假设您有某种列表指示每个字符串的开始和结束位置:

struct Node {
   int startOffset;
   int size; // includes trailing zero; 
             // (not really needed: can search for it with strlength)
};

并且你想要编写一个函数,给定上面的vector<Node>和带有字符串的char数组(让我们称之为chars),对第i个节点进行混洗,以便对于第i个节点,nodes[i].startOffset + nodes[i].size == nodes[i+1].startOffset

您可以执行以下操作(假设第0个节点位于startOffset 0,并且节点向量按startOffset排序):

Node prev = nodes[0];
for (int i = 1; i<nodes.length(); i++) {
    Node n = nodes[i];
    int targetOffset = prev.startOffset + prev.size;
    memmove(chars + targetOffset, chars + n.startOffset, n.size);
    n.startOffset = targetOffset;
    prev = n;
}