Re: use string for C API
Am 05.10.2011 00:39, schrieb Daniel Kr?gler:
Am 04.10.2011 20:50, schrieb gast128@hotmail.com:
Hello all,
Item 16 of Scott Meyers 'Effective STL' describes that a vector can be
used as a buffer for C API (output) functions, since its underlying
memory layout is guaranteed to be the same, i.e.
size_t fillArray(double* pArray, size_t n)
std::vector<double> v(10);
fillArray(&v[0], v.size());
It also explicitly describes that this is only true for vectors and
not for (basic_)string's. This is kinda of pity since strings have
often small string optimizations (e.g. the string in Plauger's STL has
a fixed buffer of 16 characters and switches to the dynamic one if
strings are longer).
As of C++11 the idiom is now safe for std::basic_string as well (But
beware of the empty case!). Note that the recommended way of using
either of is now via
fillArray(v.data(), v.size());
because this will also work for empty vector/string (Note that the
returned pointer value is unspecified for the empty case, so do not rely
on the assumption that it would be a nullptr).
Let me clarify here, that the unspecified pointer value applies to
vector and array<T, 0>. For std::basic_string the pointer value is
specified to be one pointing to a value-initialized character. In this
sense, the usage of
fillArray(&v[0], v.size());
is defined for basic_string since C++11 even for the empty case. I still
recommend to use the
fillArray(v.data(), v.size());
because that also works for other containers (array, vector) in the
empty case.
Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]