变长int C ++

时间:2016-01-31 19:56:27

标签: c++ int overflow ram

我有一个程序,它接收一个只是一个集合列表的文件,每个集合都有自己的整数标识符,然后按成员数量对这些集合进行排序。

文件格式(R之后的数字是ID):

R1

0123

0000

R2

0321

R3

0002

...

struct CodeBook {
   string Residue; //stores the R lines
   vector<string> CodeWords; //stores the lines between the R lines
};

vector<CodeBook> DATA;

对于我运行的每个文件,集合的数量变大,目前我只是将所有内容存储到巨大的向量DATA中。我的最新文件足够大,我已经接管了服务器的内存并流入交换机。这将是我可能切换到更友好的RAM算法之前处理的最后一个文件。使用该文件,集合的数量大于无符号的32字节int。

我可以计算将会有多少,并且集合的数量对于计算目的很重要,因此溢出不是一种选择。一直到无符号长long int也不是一种选择,因为我已经大大超出了内存使用量。

如何实现可变长度整数以更有效地存储所有内容,以便更有效地计算所有内容?

Ex:小id int得到1或2个字节,最大的int得到5个字节

PS:考虑到我所使用的大小,速度也是一个因素,如果它可以帮助,但它不是最重要的问题:/

1 个答案:

答案 0 :(得分:0)

将所有内容存储在两个巨大的向量中。

使用关联向量定义两个结构:

struct u { int id; unsigned count };
struct ull { int id, unsigned long long count };

std::vector<u> u_vector;
std::vector<ull> ull_vector;

将计数读入无符号长整数。如果计数符合无符号,则将其存储在u_vector中,否则存储在ull_vector中。对两个向量排序;首先输出u_vector,然后输出ull_vector

不要尝试使用unsigned char做同样的事情 - 结构与u的大小相同(因为填充使id对齐)