满足我的要求的最佳数据容器?

时间:2014-01-08 06:42:58

标签: c++11

我正在编写一个自定义3D模型导出/导入器,现在我正在使用我的自定义文件类型的导出器。基本上,格式由@符号+关键字组成,用于表示节,例如:

@version(1.0)
@name("test")
@source("src/test.model")

@mesh
  @vertices(v34,4,5512 v23,56,75)
  @indices(i0, 1, 2 i3, 4, 5)
@end

我遇到的问题是如何为此任务选择容器(矢量,列表,双端队列,地图等)。这是我的规格:

  1. 关键字(@mesh,@ animation等)永远不会改变,所以我不太关心插入/删除性能。
  2. 关键字有三种不同的“层次”:全局,对象和属性,因此我将在容器中需要3个不同的部分来存储每个部分。
  3. 从文件中读取关键字时,我需要针对容器进行检查以确保它是有效的关键字,因此我将进行大量搜索。因此,我更喜欢能够比O(n)更快地执行搜索的容器。
  4. 考虑到这些要求,我仍然无法想到一个容器,它允许我存储所有三层关键字,而不必拥有三个单独的容器(浪费)。任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

enum GlobalKeywords {
    GK_FIRST = 0,
    GK_VERSION = GK_FIRST,
    GK_NAME,
    // .... more here
    GK_COUNT // Always last one
};
static char const * const GLOBAL_KEYWORD_STRINGS[GK_COUNT] = {
    "version", "name" //...
};

enum ObjectKeywords {
    OK_FIRST,
    OK_MESH = OK_FIRST,
    // .... more here
    OK_COUNT // Always last one
};

static char const * const OBJECT_KEYWORD_STRINGS[OK_COUNT] = {
    "mesh" //...
};

enum AttributeKeywords {
    AK_FIRST = 0,
    AK_VERTICES = AK_FIRST,
    AK_INDICES,
    //...
    AK_COUNT
};
static char const * const ATTRIBUTE_KEYWORD_STRINGS[AK_COUNT] = {
    "vertices", "indices" //...
};

enum class KeywordCategory {
    KC_GLOBAL,
    KC_OBJECT,
    KC_ATTRIBUTE
}; 

输入std::unordered_map<std::string, std::pair<Keywordcategory, std::uint32_t>> mapping;

插入:

for(std::uint32_t i = GK_FIRST; i < GK_COUNT; ++i) 
{
    mapping[GLOBAL_KEYWORD_STRINGS[i]] = std::make_pair(KC_GLOBAL, i);
}

for(unsigned i = OK_FIRST; i < OK_COUNT; ++i) 
{
    mapping[OBJECT_KEYWORD_STRINGS[i]] = std::make_pair(KC_OBJECT, i);
}

for(unsigned i = AK_FIRST; i < AK_COUNT; ++i) 
{
    mapping[ATTRIBUTE_KEYWORD_STRINGS[i]] = std::make_pair(KC_ATTRIBUTE, i);
}

现在你有一个带有O(1)查找的映射对象,它会告诉你它是什么类别以及作为数字表示的确切条目。

HTH,