C++11 适合我的要求的最佳数据容器?

C++11 适合我的要求的最佳数据容器?,c++11,C++11,我正在编写一个自定义三维模型导出/导入器,现在我正在为自定义文件类型编写导出器。基本上,格式由@symbol+a关键字组成,用于表示节,例如: @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 我遇到的问题是如何为这个任务选择一个容器(vector、list、deque、map等)。以下

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

@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
我遇到的问题是如何为这个任务选择一个容器(vector、list、deque、map等)。以下是我的说明书:

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

    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::无序映射

    插入:

    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);
    }
    
    for(std::uint32\u t i=GK\u优先;i
    现在您有了一个带有O(1)查找的映射对象,它告诉您它是什么类别,以及作为数字表示的确切条目


    HTH,

    看看这个,我想你可能有一些类/结构,它们代表网格,也代表顶点和索引。我将使用
    std::unordered_map
    boost::variant
    作为值类型,并将
    std::string
    作为键。但是如果没有自定义键,并且程序知道所有这些键,我甚至会将关键字映射到
    enum类
    @Vinzenz:Correct。数据通过模型加载库收集并优化,然后写入该文件。编写此文件时,性能不是一个问题,因为它不是在运行时完成的。然而,加载这个文件是…所以我把它们都映射到它们自己的枚举类,还是同一个?在我“映射”它们之后我该怎么做?好的,我只是看到我误解了你需要容器的内容。我在看文件,以为你想把它画出来。我应该好好读一下这个问题,对不起。我希望我现在明白了。忘记我的第一句话;)我将发布一个例子。很有趣。我会在早上实施,谢谢!