c-我应该使用哪种数据结构来建模数据库/表?

数据库通常看起来像这样

┃Name|Age|..┃
┠────┼───┼──┨
┃John│025│..┃
┃Carl│033│..┃
┃....│...│..┃

在这种情况下,我的意思是一个具有固定列大小和可变大小的未排序行的表,可以通过id对其进行寻址.

C 11(或更早的版本)中是否存在可以表示此类数据的数据结构?

我想到了几种欺骗这种结构的方法,但是它们都不是完美的.

1.单独的std :: vector

std::vector<std::string> name;
std::vector<unsigned int> age;

// Write
name.push_back("John");
age.push_back(25);

// Read
std::cout << "The first entry is (" << name[0] << " | " << age[0] << ")\n";

但是,定义一个包含许多列的表需要很多标记,并且通过在每个std :: vector上调用push_back写入表确实很麻烦.

2. std :: std :: tuple的向量

(在这种情况下,std :: pair就足够了)

std::vector<std::tuple<std::string, unsigned int>> table;

// Write
table.push_back(std::make_tuple("John", 25));

// Read 1
std::string name;
unsigned int age;
std::tie(name, age) = table[0];
std::cout << "The first entry is (" << name << " | " << age << ")\n";

// Read 2
enum
{
    NAME = 0,
    AGE
}
std::cout << "The first entry is (" << std::get<NAME>(table[0]) << " | "
<< std::get<AGE>(table[0]) << ")\n";

(对不起,如果我在这里弄乱了东西;我从昨天开始就知道std :: tuple的存在)

很好,但是这一次,当您必须定义要放入值的新变量时,要进行大量的标记读取.您可以对需要的值使用任何变量进行std :: tie即可,但这变得难以理解.第二种方法几乎是完美的,但是我不希望在C 11中使用隐式枚举.

3. std :: vector的std :: vector

enum
{
    NAME = 0,
    AGE
}

std::vector<std::array<std::string, 2> table;

// Write
table.push_back({"John", "25"});

// Read
std::cout << "The first entry is (" << table[0][NAME] << " | " << table[0][AGE] << ")\n";

这也相当不错,但是它遇到了与2.2相同的问题.同样,这仅允许std :: string值.作为交换,它提供了更短更好的语法.

最佳答案
我建议一个std :: vector< Record>保留您的记录.

使用std :: map< key,vector_index>作为记录的索引.这将使您可以通过不同的搜索条件访问记录,而无需始终对向量进行排序.

转载注明原文:c-我应该使用哪种数据结构来建模数据库/表? - 代码日志