multi-dimensional 多地图可以吗?

Are multi-dimensional multi maps possible?

multimap的所有例子,还没找到multi-dimensional例子...

系统:Visual Studio 2019,C++。没有额外库的 Winapi 预期结果:存储一个 multi-dimensional 数组 key/value 对。能够通过指定 parent 密钥对(类似于 Perl 中的哈希)

来提取密钥对

使用 multimap 而不是 map,因为一些字段具有相同的 header。 我的数据示例:

conversationID(int)
 |
 ConversationType(wstring)
 lineID(int)
    |
     lineType(wstring)
     originalLine(wstring)
     taggedLine(wstring)
     wordID
        |
    ...

声明结构:

#include <map>
multimap< int, multimap <int, multimap <wstring, multimap <wstring, multimap <wstring, multimap<wstring, wstring> > > > > > conversation;                        
multimap< int, multimap <int, multimap <wstring, multimap <wstring, multimap <wstring, multimap<wstring, wstring> > > > > > ::iterator conversationIt;         

尝试在其中存储一些东西...(错误:“没有重载函数的实例”)

conversation.insert(make_pair<int,int>(2, 1 make_pair<wstring, wstring>(L"originalLine", line)));

也试了下面但是发现multimap不支持[] insert:

conversation[0][0][L"originalLine"][line];

根据上面的树形图,最好的方法是简单的多维数组。

  • 这允许重复的“键”
  • 可以通过使用支持表来实现混合变量类型(参见下面的示例)

与其他方法相比:

  • 地图不允许重复键
  • 多图。无法让它工作。试了几个星期。
  • class继承。不会 link 子分支到上面的分支。它只是一种无需重复您的工作即可公开变量和方法的方法。
  • 还研究了多重集、向量等

注意:对于大型多维数组,您将需要使用堆内存。

void conversationArray(LPWSTR line)
    {
        auto conversation = new int[5][10000][100][50];       // conversationID, lineID, objectID, tagid = tag/text
        wstring conversationType[3];
        auto lineType = new wstring[5][10000];                // conversationID, lineID = string
        wstring text[50];
    
        conversationType[0] = L"chat gui";
        lineType[0][0] = L"chat";
        conversation[0][0][14][12] = 25;
        conversation[0][0][15][12] = 30;
        lineType[0][1] = L"chat1";
        conversation[0][1][15][12] = 500;
        lineType[0][2] = L"chat2";
        conversation[0][2][15][12] = 60;
    
        conversationType[1] = L"chat gui1";
        lineType[1][0] = L"chat-also";
        conversation[1][0][15][12] = 33;
        
        // if tag id = 0 then tag is text
        conversation[0][0][14][0] = 0;
        conversation[0][0][15][0] = 20;
        text[0] = line;
        text[20] = L"dog";
    
        // print out
        int records = 0;
        for (int conversationID = 0; conversationID < 5; conversationID++)
        {
            //sendToReportWindow(L"conversationID: %d\n", conversationID);
    
            for (int lineID = 0; lineID < 10000; lineID++)
            {
                //sendToReportWindow(L"lineID:%d\n", lineID);
    
                for (int objectID = 0; objectID < 100; objectID++)
                {
                    //sendToReportWindow(L"objectID:%d\n", objectID);
    
                    for (int tagID = 0; tagID < 50; tagID++)
                    {
                        if (conversation[conversationID][lineID][objectID][tagID] >= 0)
                        {
                            if (tagID > 0)
                            {
                                sendToReportWindow(L"conversationID:%d type:%s\n", conversationID, conversationType[conversationID].c_str());
                                sendToReportWindow(L"lineID:%d type:%s\n", lineID, lineType[conversationID][lineID].c_str());
                                sendToReportWindow(L"conversation[%d][%d][%d][%d]= %d\n", conversationID, lineID, objectID, tagID, conversation[conversationID][lineID][objectID][tagID]);
                                sendToReportWindow(L"\n");
    
                            }
                            else
                            {
                                sendToReportWindow(L"conversationID:%d type:%s\n", conversationID, conversationType[conversationID].c_str());
                                sendToReportWindow(L"lineID:%d type:%s\n", lineID, lineType[conversationID][lineID].c_str());
                                sendToReportWindow(L"conversation[%d][%d][%d][%d] text = %s\n", conversationID, lineID, objectID, tagID, text[conversation[conversationID][lineID][objectID][tagID]].c_str());
                                sendToReportWindow(L"\n");
                            }
                            records++;
                        }          
                    }
                }
            }
        }
        sendToReportWindow(L"records:%d\n", records);
        sendToReportWindow(L"\n");
    
        // print all records on a specific branch. all lines for conversation 1, line 0
        int conversationID = 1; int lineID = 0;
        sendToReportWindow(L"Just print a subset of conversation:%d and Line:%d\n", conversationID, lineID);
    
        for (int objectID = 0; objectID < 100; objectID++)
        {
            for (int tagID = 0; tagID < 50; tagID++)
            {
                if (conversation[1][0][objectID][tagID] >= 0)
                {
                    if (tagID > 0)
                    {
                        sendToReportWindow(L"conversationID:%d type:%s\n", conversationID, conversationType[conversationID].c_str());
                        sendToReportWindow(L"lineID:%d type:%s\n", lineID, lineType[conversationID][lineID].c_str());
                        sendToReportWindow(L"conversation[%d][%d][%d][%d]= %d\n", conversationID, lineID, objectID, tagID, conversation[conversationID][lineID][objectID][tagID]);
                        sendToReportWindow(L"\n");
    
                    }
                    else
                    {
                        sendToReportWindow(L"conversationID:%d type:%s\n", conversationID, conversationType[conversationID].c_str());
                        sendToReportWindow(L"lineID:%d type:%s\n", lineID, lineType[conversationID][lineID].c_str());
                        sendToReportWindow(L"conversation[%d][%d][%d][%d] text = %s\n", conversationID, lineID, objectID, tagID, text[conversation[conversationID][lineID][objectID][tagID]].c_str());
                        sendToReportWindow(L"\n");
                    }
                }
            }
        }
    
        delete[] conversation; delete[] lineType;
    }