6

这个问题适用于任何类型的静态数据。我只是int用来保持示例简单。

我正在读取一个包含整数的大型 XML 数据文件并将它们存储在vector<int>. 对于我正在使用的特定数据,相同的值连续重复多次是很常见的。

<Node value="4" count="4000">

count属性意味着该值将被重复 x 次:

for(int i = 0; i < 4000; i++)
    vec.push_back(4);

当我已经知道它将连续出现 4000 次时,重复存储相同的值似乎是浪费内存。但是,我需要能够在任何时候对向量进行索引。

对于较大的数据对象,我知道我可以只存储一个指针,但在上面的示例中仍然需要存储 4000 个相同的指针。

是否有任何类型的策略来处理这样的问题?

4

3 回答 3

9

使用两个向量。第一个向量包含索引,第二个向量包含实际值。

填写索引向量,使索引[i-1] 和索引[i] 之间的所有索引的值都在值[i] 中。

然后在索引数组上使用二进制搜索来定位值数组中的位置。二进制搜索非常有效 (O(log n)),与原始方法相比,您只会使用一小部分内存。

如果您假设以下数据:

4000 ints with value "4"
followed by 200 ints with value "3"
followed by 5000 ints with value "10"

您将创建一个索引向量和值向量并像这样填充它:

indices = {4000, 4200, 9200}; // indices[i+1] = indices [i] + new_count or 0
values = {4,3,10};

正如其他答案中所建议的那样,您可能应该将其包装在运算符 [] 中。

于 2012-11-23T12:46:03.627 回答
3

我建议编写一个特定的类而不是使用vector. 您的类应该只保存项目在列表中出现的次数并以智能方式计算索引,以便您可以轻松地根据索引检索元素。

于 2012-11-23T12:45:22.990 回答
1

尝试使用类似矢量的接口(operator[]等等)将您的数据包装到一些对象中,这样您就可以隐藏实现细节(即您实际上并没有存储 4000 个数字)但提供类似的接口。

于 2012-11-23T12:45:18.913 回答