2011-01-24 8 views
1

크기vector으로 인쇄하려고합니다. 쉽게 들리지만 벡터는 map입니다. 나는이 같은 크기를 표시하려고
map<string, vector<map<vector<string> , vector<string> > > >::iterator it;반복자를 통한 벡터의 인쇄 크기

: 현재 나는이처럼 보이는지도에 반복자를


편집 :
반복자는 다음과 같이 intialised한다 : it = csvMap.find(commandList.at(lineCount));


cout<<"Size of vector in Map after modifying: " << it->second.size() <<"\n"<<endl;

작동하지 않는 경우 프로그램이 다운됩니다. 나는 임시 벡터을 만들고 그 값을 it->second; 으로 채우는 것이 좋다고 생각한다. 그러나 크기를 얻는 것은 단지 공간을 낭비하는 것이 아닌가?

이렇게하는 더 좋은 방법이 있습니까?

미리 감사드립니다.


EDIT2 :가 제거 된 코드


편집 3 : 새로운 코드 :


  map<vector<string> , vector<string> > parameterMap; 
     parameterMap.insert(pair<vector<string> , vector<string> > (
      part1_input, part2_output)); 

     map<string, vector<map<vector<string> , vector<string> > > >::iterator it; 

     cout<<"\nSize of CSV Map before modifying: " << csvMap.size() <<endl; 
     //cout<<"Size of vector in CSV Map before modifying: " << it->second.size() <<"\n"<<endl; 


     if(csvMap.size() == 0) 
     { 
      /* 
      * csvMap is empty -> no need to search for something. Just insert the fist entries 
      */ 
      listedParameterMap.insert(listedParameterMap.end(), 1, parameterMap); 
      csvMap.insert(pair<string, vector<map<vector<string> , 
       vector<string> > > > (commandList[lineCount], 
       listedParameterMap)); 
      cout<<"CSV Map size: " << csvMap.size() <<endl; 
     } 
     else 
     { 
      /* 
      * Search if the Command is already available, if not, 
      * add it to the map with its corresponding list of maps (in/output values) 
      * find returns map::end if key is not found 
      */ 

      cout<<"Checking if: " << commandList.at(lineCount) << " is already in the list \n" << endl; 
      it = csvMap.find(commandList.at(lineCount)); 
      if (it == csvMap.end()) 
      { 
       /* 
       * it = csvMap.end() is true 
       * The command isn't found 
       */ 

       cout<< commandList.at(lineCount) << " command not available. Inserting it! \n" << endl; 
       listedParameterMap.insert(listedParameterMap.end(), 1, parameterMap); 
       csvMap.insert(pair<string, vector<map<vector<string> , 
       vector<string> > > > (commandList[lineCount], 
       listedParameterMap)); 
      } 
      else 
      { 
       /* 
       * it != csvMap.end() 
       * The command is found. Append the parameterMap to the vector in the map 
       */ 
       cout<< commandList.at(lineCount) << " is already in the list! Appending parameters on pos: "<< it->second.size()-1<< "\n" << endl; 
       it->second.push_back(parameterMap); 
      } 
     } 
     cout<<"\nSize of CSV Map after modifying: " << csvMap.size() <<endl; 
     cout<<"Size of vector in CSV Map after modifying: " << it->second.size() <<"\n"<<endl; 
나는 사람이 여전히이 읽고 희망을 ...

이제는 it.second이 첫 번째 간섭에서 문제가되는 것으로 확인되었습니다. 그러나 나는 이유를 알지 못합니다. (또한 위의 코드에서)
코드 :

if(csvMap.size() == 0) 
     { 
      /* 
      * csvMap is empty -> no need to search for something. Just insert the fist entries 
      */ 
      listedParameterMap.insert(listedParameterMap.end(), 1, parameterMap); 
      csvMap.insert(pair<string, vector<map<vector<string> , 
       vector<string> > > > (commandList[lineCount], 
       listedParameterMap)); 
      cout<<"CSV Map size: " << csvMap.size() <<endl; 
      cout<<"listedParameterMap: " << listedParameterMap.size() <<endl; 
      cout<< commandList.at(lineCount) << " is already in the list! Appending parameters on pos: "<< it->second.size()<< "\n" << endl; 
     } 

이 보인다되지 작동합니다. 그것으로 그것의가는 것이 있더라도. 왜 그런가? comanndList 및 listedParameterMap은 내가 확인한 것입니다.

+1

반복 루프를 게시하십시오. 우리는 맥락이 필요합니다. –

+0

'it-> second.size()'를 사용하기 전에'if (it! = csvMap.end())'를 체크하고 있는가? – Naveen

+0

검색중인'lineCount'가 존재합니까? 검색 후'map :: end'와 평등을 확인합니까? –

답변

3
it = csvMap.find(commandList.at(lineCount)); 
if (it == csvMap.end()) { 
    cout << "not found\n"; 
} 
else { 
    cout << "Size of vector in Map after modifying: " << it->second.size() << '\n'; 
} 

어느 명령을 찾을 수 없을 때 또는 명령 최후입니다

아니요, 최종 반복기는 ite가 아닙니다. 컨테이너에 있습니다. 반복자는 끝 반복자 후이 있기 때문에 그것을 역 참조 할 때

string c = (*it).first; 

는, 당신은 행동을 정의되지 않은했다.

+0

@Fred CashCows 대답 pls에 내 의견을보세요 – Beasly

+0

@Beasly : 그것은 어떻습니까? 내가 말했듯이, 최종 반복자는 컨테이너의 항목이 아닙니다. –

+0

@Fred Yea 나는 너를 잡았다. 왜 이런 생각이라고 말하는지. 그래서 map :: end는 빈 필드인가? – Beasly

0

지도 반복기는 특정 요소를 지우지 않는 한 무효화되지 않습니다. 그건 당신이 뭔가 잘못한 것을 의미합니다.

1

it이 잘못된 위치를 가리키고 있습니다. 지도의 반복자를 사용하여 초기화해야합니다. 예 : it = myMap.find("aaa"); //Replace it with actual keyfind을 수행 한 후에 다시 검사하여 유효한 반복자가 있는지 확인해야합니다. myMap.end().

현재 초기화되지 않은 반복자를 사용하는

편집 :

cout<<"Size of vector in CSV Map before modifying: " << it->second.size() <<"\n"<<endl; 

또한, csvMap.end()을 가리키는 반복자 역 참조, 다시 충돌이 발생합니다 수 없습니다. EDIT 3

당신은 여전히 ​​if(csvMap.size() == 0)if(it == csvMap.end()) 경우 종료를 가리키는 초기화되지 반복자/반복자를 사용하는 당으로

. 이러한 경우 it = csvMap.insert(....).first;과 같이 insert 함수의 반환 값으로 it을 초기화해야합니다.

+0

죄송합니다. 물론이 작업을 수행했습니다 ... 코드를 추가합니다 – Beasly

+0

초기화 코드를 게시 할 수 있습니까? – Naveen

+1

EDIT2에 따라 위의 설명은 여전히 ​​유효합니다. 초기화되지 않은 반복자를 사용 중입니다. 또한 iteator를 사용하는 동안 게시 된 코드에 더 많은 문제가 있습니다. – Naveen

0

컬렉션이 다소 복잡합니다.

크기를 확인하기 위해 요소가 있다는 것을 알아야합니다. 즉, find는지도의 "끝"을 반환하지 않았습니다. 이 경우 반환 된 반복기를 사용할 수 없습니다.

물론 당신이 처리하는 방법은 당신 자신의 결정입니다. 문자열이 발견되지 않으면 0을 반환합니다 (0은 발견되었지만 내용이 없음을 나타냄).

이제 내가 바로 버그 자리 코드를 편집 한 :

if (it == csvMap.end()) 
      { 

      /* 
      * it = csvMap.end() > true 
      * Either when command isn't found or command is the last 
      */ 

      string c = (*it).first; 

당신이 끝 역 참조 (it가) 수를

+0

API에서 가져온 것 : '지정된 키 값이 발견되면 요소에 대한 반복자입니다. 또는 지정된 키가 컨테이너에없는 경우 map :: end'그래서 마지막 요소를 가리키는 포인터를 찾지 못했습니다 ... – Beasly

+0

찾을 수없는 경우 map :: end를 가리 킵니다. 그러나 마지막 요소가 아니므로 마지막 요소를 지난 것입니다. – CashCow

관련 문제