2011-01-18 1 views
2

stringstreamオブジェクトの関連する文字列にアクセスしてイテレータを保持しようとしていますが、これが安全かどうかを知ることができません。コードは次のとおりです:stringstreamオブジェクトの関連する文字列へのアクセス

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

ちょうどスタイルの発言:カンマ(=悪いスタイル)で1行に2つの 'const_iterator'(' begin'と 'end')を宣言し、宣言のすぐ下にそれらを代入/初期化しています。より良いでしょう: 'string :: const_iterator begin = HTMLstr.begin(); string :: const_iterator end = HTMLstr.end(); '(2行で)。これはエラーが起こりにくく、コードワイズに相当します。 – rubenvb

答えて

2

ストリングストリームのstrメソッドを詳しく見てください。文字列オブジェクトへの参照ではなく、文字列のコピーを返します。理論的には、あなた自身が文字列を変更しない限り、イテレータは無効にならないでしょう。

0

あなたはおそらく考えるよりも安全ですが、別の理由があります。 HTMLss.str()は内部文字列のコピーを返し、このコピーはconst参照にバインドされます。 C++の規則に従って、ローカルのconst参照にバインドされている一時的なものは参照の存続期間を持ちます。だから、基本的にはあなたが投稿したコードがこれにほぼ同等である:

string HTMLstr = HTMLss.str(); 

唯一の違いは、このバージョンは、コピーコンストラクタを呼び出すことです。ただし、この呼び出しは最適化されています。

0

これは寿命延長HTMLstrの範囲にある、一時的に返します。

const string & HTMLstr = HTMLss.str(); 

これはHTMLssに行われた後の変更は反映されません、HTMLssのバッファのコピーですが、それは完全に見つけることですので、 HTMLstrがスコープ内にある限り、イテレータをHTMLstrに保持して使用してください。

しかし、あなたは同様に非参照をHTMLstrなるかもしれないが、あなたが好きなようにあなたはconstとして維持する(またはそれをドロップする)ことができます。

const string HTMLstr = HTMLss.str(); 

のconstを維持あなたは無効にすることができる方法を削減しイテレータは、元のコードでも問題はありませんでした。

関連する問題