如果决定使用vector和string代替传统的数组,就要考虑如何与旧的C API和平共处。
如果有一个vector v,同时需要一个指向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.begin()来代替&v[0],因为begin()返回的是迭代器,迭代器并不一定等同于指针.可以使用&*v.begin()代替&v[0],但可读性比较差,并且需要敲入更多的字符。
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返回的指针并不一定指向字符串数据的内部表示。
对于vector v,如果C API试图改变v中元素的值。需要注意:不能改变v中元素的个数,不能在vector未使用的容量中“创建”新元素。否则,v.size()将无法返回正确结果。更不要试图改写vector的容量之外的数据,结果肯定非常可怕。