2011-01-18 7 views
2

문자열 스트림 객체의 연관된 문자열에 액세스하려고하고 반복자를 유지하려고하지만이 객체가 안전한지 여부를 알 수 없습니다. 다음은 코드입니다.문자열 스트림 객체의 연관된 문자열에 액세스

stringstream HTMLss; // string stream of HTML document 

    // ... (load up HTMLss with HTML) 

    const string & HTMLstr = HTMLss.str(); // grab reference to associated string 
    string::const_iterator begin,end; 
    begin = HTMLstr.begin();     // grab iterators to that string as well 
    end = HTMLstr.end(); 
    boost::match_results<std::string::const_iterator> matches; 

    // do some processing, updating the iterators along the way 
    while(boost::regex_search(begin, end, matches, metaexp)) 
    { 
     string key(matches[1].first, matches[1].second); 
     string raw_val(matches[2].first, matches[2].second); 

     // ... some processing which does NOT manipulate HTMLss stringstream in any way 

     begin = matches[2].second; // updating the iterator 
    } 

내 질문에 - 안전합니까? stringstream 객체의 관련 문자열을 가리키는 반복자를 유지/업데이트 할 수 있고 동작이 올바른 것으로 가정 할 수 있습니까? 문자열 스트림 함수에 대한 다른 호출은 없습니다. 이것이 안전한지 어떻게 알 수 있습니까?

+0

반복기를 저장하고 사용하는 사이에 반복기를 무효화하는 작업을하지 않는 한 안전합니다. 즉, 실제로 저장소를 저장하는 것이 아니라 직접 사용하는 것이 좋습니다 (이 경우 regex_search 호출에서 사용). –

+1

스타일 주석 : 한 줄에 두 개의'const_iterator' ('begin'과'end')를 쉼표 (bad style)로 선언하고 선언 바로 아래에 할당/초기화하고 있습니다. 더 좋을 것이다 :'string :: const_iterator begin = HTMLstr.begin(); string :: const_iterator end = HTMLstr.end();'(두 줄에). 이것은 오류가 발생하기 쉽고 코드에 상응합니다. – rubenvb

답변

2

stringstream의 str 메서드를 자세히 살펴보십시오. 문자열 객체에 대한 참조가 아니라 문자열의 복사본을 반환합니다. 이론상으로, 당신 자신이 문자열을 변경하지 않는다면 반복자는 무효화되지 않을 것입니다. 이 HTMLss의 버퍼의 복사, HTMLss에 대한 모든 이후 변경 사항이 반영되지 않습니다 때문에

const string & HTMLstr = HTMLss.str(); 

,하지만 완벽에 찾을 수있다 :

0

안전 할 수도 있지만 다른 이유로 생각할 것입니다. HTMLss.str()은 내부 문자열의 복사본을 반환하며이 복사본은 const 참조에 바인딩됩니다. C++ 규칙에 따라 로컬 const 참조에 바인딩 된 임시에는 참조 수명이 있습니다. 그래서 기본적으로 사용자가 게시 된 코드는 거의 동일합니다 :

string HTMLstr = HTMLss.str(); 

유일한 차이점이 버전은 복사 생성자를 호출 할 수 있다는 것이다. 그러나이 호출은 최적화되어있을 수 있습니다.

0

이것은 HTMLstr의 범위에 수명 - 확장되는 임시을 반환 HTMLstr이 범위 내에있는 한 반복자를 유지하고 HTMLstr에 반복자를 사용하십시오. 당신은 무효화 할 수있는 방법을 줄일 않는 const를 유지

const string HTMLstr = HTMLss.str(); 

:

그러나 당신이 원하는대로, 당신은뿐만 아니라 비 참조를 HTMLstr 만들 수도 있지만 CONST를 유지 (또는 드롭) 수 iterators하지만 원래 코드에서도 문제가 없었습니다.

관련 문제