0

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> > >

是非聞きたいです。

ここまで読んでくれてありがとう:)

4

1 に答える 1

2

より具体的なエラー メッセージを取得するには、問題のある行を次のように分類できます。

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>ため、second を使用します。ただし、ネストされたマップがコピーされます。

代わりにそれへの参照を使用する方が良いかもしれません。その場合、あなたが私たちに見るように求める行は次のようになります:

 unordered_map<string, list<string> > &temp(nodeContainer.find(sectionName.getStringValue())->second);
于 2013-08-16T00:40:37.570 に答える