通常情况下。旧的C API使用数组合char*指针来进行数据交换而不是vector或string对象。

这种API还将存在非常长的一段时间,假设我们想有效地使用STL。我们就必须与它们和平共处。

幸运的是,这非常easy做到。假设有一个vector v,而须要得到一个指向v中数据的指针,从而可把v中的数据作为数组来对待,那么仅仅须要使用&v[0]就能够了。对于string
s。相应的形式是s.c_str()。所以。假设我们希望把v传给一个例如以下所看到的的C API:

void dosomething(const int* pInts,size_tnumInts);

则我们能够这样做:

if (!v.empty())

{

dosomething(&v[0],v.size());

}

由于v可能是空的。&v[0]则试图产生一个指针,而该指针指向的东西并不存在。这可不好,所以须要先推断一下。确保安全。

)string中的数据不一定存储在连续的内存中;(2)string的内部表示不一定是以空字符结尾的。这也正说明了为什么在string中存在成员函数c_str()。

c_str()函数返回一个指向字符串的值的指针。并且该指针可用于C。

因此,我们能够把一个字符串s传给以下的函数:

void dosomething(const char* pString);

例如以下所看到的:

void dosomething(s.c_str());

注意:假设传递的C API改变了v中元素值的话。一般是能够的,但被调用的例程不能试图改变矢量中元素的个数。

比方,不能试图在vector的未使用的容量中创建新元素。不然,v的内部将会变得不一致,由于它从此无法知道自己的正确的大小,v.size()将产生不对的结果。

先让C API把数据写入到一个vector中。然后把数据复制到期望终于写入的STL容器中。这一思想总是可行的:

size_t fillArray(double *pArray,size_t arraySize);

vector<double> vd(maxNumDouble);

vd.resize(fillArray(&vd[0],vd.size()));

deque<double> d(vd.begin(),vd.end());

list<double> l(vd.begin(),vd.end());

set<double> s(vd.begin(),vd.end());

并且这意味着,除了vector和string以外的其它STL容器也能把他们的数据传递给C API。仅仅须要把每一个容器的元素复制到一个vector中,然后传给该API:

void dosomething(const int* pInts,size_tnumInts);

set<int> intSet;

vector<int>v(intSet.begin(),intSet.end());

if (!v.empty())

dosomething(&v[0],v.size());

最新文章

  1. mysql 插入数据失败防止自增长主键增长的方法
  2. curl 模拟请求get/post
  3. Java数据类型、变量、运算符、语句。
  4. git 删除和重命名文件
  5. HYSBZ 2440 完全平方数(莫比乌斯反演)
  6. 【Mysql】phpMyAdmin安装与配置
  7. html+css—two
  8. Source insight怎样恢复默认界面布局 窗口嵌入
  9. Wall---hdu1348(求凸包周长 模板)
  10. Confluence 5.4实现与JIRA前所未有的集成
  11. 【Qt】QSettings介绍【转】
  12. Linux关闭防火墙、SELinux
  13. hibernate 多对一的情况
  14. mina的编码和解码以及断包的处理,发送自己定义协议,仿qq聊天,发送xml或json
  15. Redis集群明细文档(转)
  16. 安装最新nodejs
  17. 微服务之路由网关—Nginx
  18. 如何生成ExecutionGraph及物理执行图
  19. 每日质量NPM包拖拽文件上传_react-dropzone
  20. HDU 2602 - Bone Collector - [01背包模板题]

热门文章

  1. Luogu P3957 跳房子
  2. poj 2236 加点 然后判断某两点是否连通
  3. SprintBoot 1.2.8 入门
  4. fpm制作rpm包
  5. 021.Zabbix的邮件告警-01
  6. querySelector/querySelectorAll选择器两个容易忽略的点
  7. 浅析Entity FrameWork性能优化
  8. 利用在线HTTP接口测试工具ApiPost,模拟移动端请求API接口
  9. Orleans入门
  10. 使用Metasploit工作区