如何把vector和string数据传递给旧的api

如果决定使用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的容量之外的数据,结果肯定非常可怕。

原文链接: https://www.cnblogs.com/zhuyf87/archive/2012/12/06/2804925.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/71719

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午3:00
下一篇 2023年2月9日 下午3:01

相关推荐