我正在编写一个自定义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
我遇到的问题是如何为此任务选择容器(矢量,列表,双端队列,地图等)。这是我的规格:
考虑到这些要求,我仍然无法想到一个容器,它允许我存储所有三层关键字,而不必拥有三个单独的容器(浪费)。任何人都可以帮我吗?
答案 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,