冗余静态数据

时间:2012-11-23 12:36:15

标签: c++ xml vector static

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

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

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

count属性表示该值重复x次:

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

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

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

是否有任何类型的策略可以解决这样的问题?

3 个答案:

答案 0 :(得分:9)

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

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

然后在indices数组上使用二进制搜索来定位values数组中的位置。二进制搜索非常有效(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};

正如其他答案中所建议的那样,你应该将它包装在operator []中。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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