vectorとstringデータを古いapiに渡す方法

1561 ワード

従来の配列の代わりにvectorとstringを使用することを決定した場合,古いC APIとどのように平和的に共存するかを考慮する.
vectorvがある場合、vのデータを指すポインタが必要であり、vのデータを配列として扱う.&v[0]を使用して、&v[0]がvの最初の要素を指し、c++標準ではvectorの要素が配列のように連続したメモリに格納されることが要求されます.
void do_something(const int * ints, size_t num_ints);
if (!v.empty())
  do_something(&v[0], v.size());

&v[0]の代わりにv.begin()を使用しないでください.begin()は反復器を返します.反復器は必ずしもポインタに等しいわけではありません.&v[0]の代わりに&*v.begin()を使用できますが、読みやすさが悪く、より多くの文字を入力する必要があります.
stringのデータは連続メモリに格納されるとは限らず、stringの内部表示は必ずしも空の文字(0)で終わるとは限らない.stringはメンバー関数c_を提供するstr()は、Cに使用できる内部文字列を指すポインタを返します.
void do_something(const char * string);
do_something(s.c_str());

stringの長さが0の場合、c_strは空の文字を指すポインタを返します.注意string内部に空の文字がある場合、do_somethingは、最初の空の文字を文字列の末尾文字とします.
vectorとstringのデータを読み取り、書き換えないAPIに渡すのが最も安全な方法です.stringにとって、これも唯一できることです.c_strが返すポインタは、必ずしも文字列データの内部表現を指すものではない.
vectorvの場合、C APIがv内の要素の値を変更しようとする場合.注意:vの要素の数を変更することはできません.vectorが使用していない容量で新しい要素を「作成」することはできません.そうでないと、v.size()は正しい結果を返すことができません.さらにvectorの容量以外のデータを書き換えようとしないでください.結果は恐ろしいに違いありません.