14

std::string には、c_str() のようにデータをフェッチするための const メンバーしかありません。ただし、文字列の最初の要素への参照を取得でき、operator[]それに書き込むことができます。

たとえば、関数がある場合:

void toupper(char *first,char *last_plus_one);

最初の要素へのポインターを取得する vector に直接書き込むことができます。

vector<char> message // has "Some Message";
toupper(&message[0],&message[0]+message.size());

std::string で同じことができますか?

string message="Some Message";
toupper(&message[0],&message[0]+message.size());

標準は、メモリの位置が実際に線形であることを保証していますか? すなわち:

&(*(message.begin()+n)) == &message[n]

ありがとう。

4

5 に答える 5

22

Herbsutter.wordpress.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/#comment-483 ) :

現在の ISO C++ では &str[0] が連続した文字列データへのポインタを作成する必要があります (ただし、必ずしも null で終わるとは限りません!)。C++0x では、std::string の内容が実際に連続して格納されなければならないという保証を既に採用しています。詳細については、http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530を参照してください。

また、Matt Austern は、参照ドキュメント ( http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530 ) で同様のことを述べています。

したがって、 str[0] を呼び出すと、変更可能な文字の配列が得られると想定できるようです (ただし、null で終了する必要はないことに注意してください)。

于 2009-04-17T15:31:13.250 に答える