2016-09-01 1 views
0

Cでは、区切り文字をNullに置き換えることができ、char * - > char *のマップを比較関数で動作させることができます。In std :: stringをキー値のマップにトークン化

私は現代のC++でこれをできるだけ速く行う方法を見つけようとしています。アイデアは、マップ内の文字のコピーを避けることです。

std::map<std::string,std::string> sample_map; 

std::string sample_string("name=alpha;title=something;job=nothing"); 

文字をコピーせずに。

元の入力文字列を失っても問題ありません。

+4

'string'はリソースを所有しているので、コピーできません。 – Barry

+0

'shared_ptr'を使います。 – rustyx

+1

'shared_ptr'よりも良い方法は、' std :: string_view'(C++ 17のドラフトの一部ですが、実験的な機能としてすでに出荷されているコンパイラのようです)を使用することです。他の選択肢は 'boost :: string_view'、' boost :: string_ref'と 'gsl :: string_span'です。 –

答えて

1

2つのstd :: stringsは同じ基本となるバイトを指すことができないため、文字列ではできません。

struct Slice { 
    string::iterator begin, end; 
    bool operator < (const& Slice that) const { 
    return lexicographical_compare(begin, end, that.begin, that.end); 
    } 
}; 

std::map<Slice,Slice> sample_map; 

をそして、あなたは元の文字列を変更した場合、すべてのイテレータが無効になることを注意してください:

あなたはイテレータを使用することができ、バイトを対処避けるために。

関連する問題