我想知道什么是一个好的解决方案,以使自定义数据结构占用尽可能少的空间,而且我一直在寻找任何东西。
总体思路是,我可能具有某种数据结构,其中包含许多不同的变量,整数,布尔值等。使用布尔值,使用位掩码/标志相当容易。对于整数,也许我只需要将10个数字用于一个整数,将50个用于另一个整数。我希望有一些功能可以对结构进行编码,而不浪费任何位。理想情况下,我可以将它们并排打包成一个阵列,而无需任何填充。
我有一个模糊的想法,我将不得不枚举所有变量值的所有可能排列方式,但是我不确定从哪里开始。
此外,尽管这可能会更复杂,但是如果我有很多限制,例如如果其他变量满足某些条件,则不关心某些变量,该怎么办?这样可以减少排列的数量,所以这里也应该有一种保存一些位的方法吗?
示例:假设我有一个在线游戏服务器,其中包含许多玩家。每个玩家。玩家结构存储了许多不同的变量,级别,状态和一堆标记,这些标记已清除了玩家的任务。
struct Player {
int level; //max is 100
int strength //max is
int int // max is 500
/* ... */
bool questFlag30;
bool questFlag31;
bool questFlag32;
/* ... */
};
我想拥有一个函数,该函数接受Player
个称为encodedData encode(std::vector<Player> players)
的向量,以及一个decodeData函数,该函数从编码数据中返回一个向量。
答案 0 :(得分:1)
这是我想出的;这不是完美的,但它是这样的:
#include <vector>
#include <iostream>
#include <bitset>
#include <assert.h>
/* Data structure for packing multiple variables, without padding */
struct compact_collection {
std::vector<bool> data;
/* Returns a uint32_t since we don't want to store the length of each variable */
uint32_t query_bits(int index, int length) {
std::bitset<32> temp;
for (int i = index; i < index + length; i++) temp[i - index] = data[i];
return temp.to_ulong();
};
/* */
void add_bits(int32_t value, int32_t bits) {
assert(std::pow(2, bits) >= value);
auto a = std::bitset<32>(value).to_string();
for (int i = 32 - bits; i < 32; i++) data.insert(data.begin(), (a[i] == '1'));
};
};
int main() {
compact_collection myCollection;
myCollection.add_bits(45,6);
std::cout << myCollection.query_bits(0,6);
std::cin.get();
return 0;
}