2013-08-15 3 views
0

Java에서 C++로 작성한 프로그램을 다시 작성하는 중입니다. 나는 내가 사용하고 복잡한 데이터 구조에 문제를 많이 데 : 그것은 나에게 동안을했다C++에서 중첩 unordered_maps

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 
} 

난 당신에게 내가 현재 작업하고있는 전체 파일을 제공합니다. 자바 코드를 직접 내 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> > > 

이상이 기능을 수행하는 더 좋은 방법이 있다면 그렇게 귀. 그 후이 함께 할 수있는 다음 단계를 작동하고 다음

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

:

훨씬 :)

+1

"나는 복잡한 데이터 구조에 많은 어려움을 겪고 있습니다."- 좋은 인정입니다. 그것이 저자로서 당신에게 복잡하다면, 기회는 여기에있는 사람들에게 훨씬 더 복잡 할 것입니다. 자신이나 SO 사람들이 문제를 해결할 수있는 더 나은 기회를 작은 관리 가능한 하위 문제로 나눔으로써 해결할 수 있습니다. – Arun

+0

문자열 맵에 문자열을 매핑하여 문자열 목록에 .... 복잡한 부분은 무엇입니까? * 복사 * 아마도 비싸지 만 명백하게 복잡하지는 않습니다. – WhozCraig

+0

@Arun 덕분에 미래를 염두에 두겠습니다. – zg303

답변

2

당신이로 문제가 라인을 분해 할 수있는보다 구체적인 오류 메시지를 얻으려면이 읽어 주셔서 감사 라인 :이 가정 코드에 최소한의 변경으로

것은 당신이 놓치고있는 것입니다 :

temp = got->second; 

find은 요소에 대한 반복자를 제공하며 map 요소의 value_type은 pair<KeyType, ValueType>이므로 초를 사용합니다. 그래도 중첩 된지도가 복사됩니다.

아마도 대신 참조를 사용하는 것이 좋습니다. 어떤 경우에 당신이 우리에게 보길 원하는 라인은 다음과 같이 될 것입니다 :

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

사실, 내 오류는 찾기 기능입니다. 키 유형과 동일한 문자열이지만 내 인수가 유효하지 않습니다. 나는 그것이 무엇인지 정말로 모른다. 나는이 프로그램 밖에서이 개념을 취하고 여기에서 무슨 일이 벌어지는지를보기 위해 예제를 할 것이다. – zg303

+1

@ zg303 aha, ok 나는 그것을 도울 수있는 제안을 추가하기 위해 나의 대답을 조정했다. 실제 컴파일러 오류 메시지는 문제가 무엇인지 이해하는 데 도움이됩니다. '이 프로그램 밖에서이 컨셉을 취할 것입니다.'좋은 생각이 들었습니다 ... – PeterSW

+0

피터, 그래서 테스트 프로그램을 만들었고 위의 작업을 문제없이 성공적으로 완료 할 수있었습니다. 그런 다음 편집에서 추가하고 실제 문제를 발견 한 제안을 시도했습니다. 매우 실망 스럽지만 "sectionName.getStringValue()"는 std :: string을 반환하지 않으며 zorba :: string을 반환합니다. 간단한 주조가 작동하지 않습니다. 네가 나에게 많은 도움을 주었기 때문에 나는이 질문에 답을주고있다. 여기에서 Zorba 사용자 그룹에 가서이 질문을 게시해야 할 것 같습니다. – zg303