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 に直接貼り付けて、1 行ずつ作業しているだけなので、多くのエラーが発生します。次のコード行に注目してください。
unordered_map< string, unordered_map<string, list<string> > >::const_iterator got = nodeContainer.find(sectionName.getStringValue());
私が追加しなければならないもう1つのことは、私はc ++に慣れていないということです。
unordered_map< string, unordered_map<string, list<string> > >
是非聞きたいです。
ここまで読んでくれてありがとう:)