Возможны ли многомерные мульти-карты? - PullRequest
0 голосов
/ 07 августа 2020

Все примеры multitimap, еще не найден многомерный пример ...

Система: Visual Studio 2019, C ++. Winapi без дополнительных библиотек. Ожидаемый результат: хранит многомерный массив пар ключ / значение. Возможность получить пару ключей, указав родительские пары ключей (аналогично хешам в Perl)

Использование multimap вместо map, поскольку некоторые поля имеют одинаковый заголовок. Пример моих данных:

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 не поддерживает вставку []:

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

1 Ответ

0 голосов
/ 26 августа 2020

Основываясь на приведенной выше древовидной диаграмме, лучший подход - простой многомерный массив.

  • это позволяет дублировать «ключи»
  • смешанные типы переменных могут быть достигнуты с помощью поддержки таблицы (см. пример ниже)

По сравнению с другими методами:

  • карта не позволяет дублировать ключи
  • multimap. не мог заставить это работать. пробовал неделями.
  • наследование классов. не связывает подчиненные ветки с ветвями выше. это всего лишь метод для раскрытия переменных и методов без дублирования вашей работы.
  • также рассмотрены мультимножества, векторы и т. д. c.

примечание: для большого многомерного массив, вам нужно будет использовать память кучи.

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...