2010-04-26 7 views
0

를 아래의 코드에서 :어떻게 표준에 삽입 ::지도

map<string,vector<int>> create(ifstream& in, const vector<string>& vec) 
{ 
    /*holds string and line numbers into which each string appears*/ 
    typedef map<string,vector<int>> myMap; 
    typedef vector<string>::const_iterator const_iter; 

    myMap result; 
    string tmp; 
    unsigned int lineCounter = 0; 

    while(std::getline(in,tmp)) 
    { 
     const_iter beg = vec.begin(); 
     const_iter end = vec.end(); 

     while (beg < end) 
     { 
      if (tmp.find(*beg) != string::npos) 
      { 
       result[*beg].push_back(lineCounter);//THIS IS THE LINE I'M ASKING FOR 
      } 
      ++beg; 
     } 

     ++lineCounter; 
    } 

    return result; 
} 

어떻게 내가 대신 [] 연산자를 사용하여지도의 삽입 방법을 사용하려는 경우가 (라인 코드에 주석 확인)해야합니까?
감사합니다.

+0

내가 닐 내기 그냥 그것의 위해 (불필요한 빈 벡터를 두 번 조회를 피할 수 있지만, 건물)에 대한

Butterworth는 이것을 알고 있습니다 – Default

+2

왜 그 행을 바꾸시겠습니까? –

+0

'vec'요소의 내부 루프는 완전히 정상입니다. 왜 보통의 for 루프를 사용하지 않는가? 나는 루프가 정상 루프와 어떻게 다른지를 알아 내는데 꽤 많은 시간을 보냈다. – MSalters

답변

3

진지하게, 나는하지 않을 것입니다.

코드를 불필요하게 복잡하게 만들뿐입니다. 지도에 새 요소를 생성하고 수정하려면 삽입을 호출해야합니다.

result.insert(std::make_pair(*beg, std::vector<int>())) 
     .first->second.push_back(lineCounter); 

편집 : 리얼 상당 (기능과 성능) :

std::map<std::string,std::vector<int> >::iterator it = result.upper_bound(*beg); 
if (it->first != *beg) { 
    it = result.insert(it, std::make_pair(*beg, std::vector<int>())).first; 
} 
it->second.push_back(lineCounter); 
+0

사실, 삽입 또는 업데이트를 수행할지 여부를 결정하기 위해 요소를 먼저 찾아야합니다. 그러나'insert (pair )'를 호출하면 삽입 된 반복자가 반환됩니다. 따라서 나중에 필요한 조회가 없습니다. – MSalters

+0

@David 나는 그것을하는 법을 알고 싶었을뿐입니다. –

+0

@MSalters : 내가 갖고있는 답변의 이전 버전에 대한 댓글인지 여부를 알 수 없습니다. 여하튼 두 가지 나쁜 옵션 중 하나를 선택해야합니다 : 한편으로는 요소가 존재하지 않으면'find'를 수행하고 (새로 삽입 된 각 요소에 대해 두 개의 조회가 필요합니다), 반면에'find'를 수행하십시오 단일 룩업을 수행하지만 요소가 실제로 존재하는 경우 벡터를 불필요하게 생성하는 빈 벡터가있는 삽입입니다. –

1

map::insert은 반복자가 포함 된 요소 (방금 삽입 한 키나 기존 키)와 성공 또는 실패를 나타내는 부울을 반환합니다. 그런 다음 iter->push_back(lineCounter)으로 전화하여 새 줄 번호를 벡터에 추가 할 수 있습니다.

...이 모든 작업을 완료하면 정확하게 operator[]이 무엇인지 깨닫게됩니다. 즉 하나의 문을 두 가지를 얻을 수 있기 때문에

1
result.insert(pair<string,vector<int>>(*beg,100), vector<int>()); 
result[*beg].push_back(lineCounter); 

이것은, (하지만 느린 너무 :-) 현재 코드보다 더 복잡하다 : (암시 적)지도에 빈 배열을 삽입, 새로운 요소를 추가 배열