c ++ 11 — вложенные unordered_maps в переполнение стека

Я нахожусь в процессе переписывания моей программы на Java для C ++. У меня много проблем со сложной структурой данных, которую я использую:

unordered_map< string, unordered_map<string, list<string> > >

Это заняло у меня некоторое время, но в итоге я смог понять, как добавить «элементы» (из-за отсутствия лучшего слова) в unordered_map. Тем не менее, я пришел к вам, потому что не могу понять, как извлечь элементы, которые я вставил в него, используя unordered_map :: find.

Мой код ниже:

/*
* QueryDDex.cpp
*
*  Created on: Aug 13, 2013
*      Author: Zach Graceffa
*/

#include <zorba/store_manager.h>
#include <zorba/xquery_exception.h>
#include <zorba/zorba.h>
#include <zorba/iterator.h>
#include <zorba/xquery.h>
#include <zorba/item.h>

#include <tr1/unordered_map>
#include <string>
#include <fstream>
#include <list>

using namespace zorba;
using namespace std;
using namespace tr1;

void runQuery (char * inFile) throw(ZorbaException)
{
//create return variable
unordered_map< string, unordered_map<string, list<string> > > nodeContainer;

//open file
ifstream myFile;
const char * ext = ".xq";
myFile.open(strcat(inFile, ext), ifstream::in);

//Instantiate the Zorba Object
void* lStore = zorba::StoreManager::getStore();
Zorba* lZorba = Zorba::getInstance(lStore);

//Feed file into string
string line;
string xqDoc;

if (myFile.is_open())
{
while (myFile.good())
{
getline (myFile, line);
xqDoc += (line + "\n");
}
myFile.close();
}
else
xqDoc = "err";

//Compile the Query
XQuery_t lQuery = lZorba->compileQuery(xqDoc);

//Create an Iterator and open it so it can be used
Iterator_t parentIterator = lQuery->iterator();
parentIterator->open();

//Create an empty Item for future use
Item lItem;

while (parentIterator->next(lItem))
{
//Create an iterator to iterate over all the child nodes that belong to the parent
Iterator_t childIterator = lItem.getChildren();

//Open the iterator for future use
childIterator->open();

//Create an empty item, which will be used to store the child nodes.
Item child;

//Select the first child node
while(childIterator->next(child)){
unordered_map<string, list<string> > childOne;

Iterator_t grandChildIterator = child.getChildren();
grandChildIterator->open();

Item grandChild;

//Create an empty item to hold the section tag name.
Item sectionName;
child.getNodeName(sectionName);
nodeContainer.insert(pair<string, unordered_map<string, list<string> > >(sectionName.getStringValue(), childOne));

while(grandChildIterator->next(grandChild)){

list<string> grandChildren;

//Create an empty Item to hold the contents of tag name
Item tagName;

//Put the tag name in variable tagName
grandChild.getNodeName(tagName);

unordered_map<string, list<string> > temp;

unordered_map< string, unordered_map<string, list<string> > >::const_iterator got = nodeContainer.find(sectionName.getStringValue());

if (temp.key_eq(tagName.getStringValue())){
list<string> s = temp.find(tagName.getStringValue());
s.insert(grandChild.getStringValue());
temp.put(sectionName.getStringValue(), s);
}else{
grandChildren.add(grandChild.getStringValue());
temp.insert(tagName.getStringValue(), grandChildren);
}
nodeContainer.insert(pair<string, unordered_map<string, list<string> > >(sectionName.getStringValue(), temp));

//Release any memory consumed by tagName
tagName.close();
//free tagName;

}//grandchild-loop
//Release any memory consumed by Item grandChild
grandChild.close();
//delete grandChild;
}//child-loop
}//end parent-loop
}

Я даю вам весь файл, над которым я сейчас работаю. Есть много ошибок, когда я вставлял Java-код прямо в мой c ++ ide и просто работаю над этим построчно. Пожалуйста, обратите внимание на эту строку кода:

unordered_map< string, unordered_map<string, list<string> > >::const_iterator got = nodeContainer.find(sectionName.getStringValue());

Еще одна вещь, которую я должен добавить, это то, что я ржавый на C ++, поэтому, если есть лучший способ реализовать эту функциональность, чем

unordered_map< string, unordered_map<string, list<string> > >

Я весь внимание.

Спасибо за чтение этого далеко 🙂

0

Решение

Чтобы получить более конкретное сообщение об ошибке, вы можете разбить проблемную строку на:

const string &keyToTemp(sectionName.getStringValue());
unordered_map< string, unordered_map<string, list<string> > >::const_iterator got = nodeContainer.find(keyToTemp);

Затем, когда это сработает, следующие шаги могут быть такими:

С минимальными изменениями в вашем коде, я полагаю, это то, что вам не хватает:

temp = got->second;

find дает вам итератор для элемента, а value_type элемента карты является pair<KeyType, ValueType> отсюда и использование второго.
Это, хотя будет копировать вложенную карту.

Может быть, было бы лучше использовать ссылку на него вместо этого. В этом случае строка, на которую вы просите нас взглянуть, станет такой:

 unordered_map<string, list<string> > &temp(nodeContainer.find(sectionName.getStringValue())->second);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]