如何把vector和string数据传给旧的C API
来源:互联网 发布:window10不能安装软件 编辑:程序博客网 时间:2024/05/23 21:45
通常情况下,旧的C API使用数组合char*指针来进行数据交换而不是vector或string对象。这样的API还将存在很长的一段时间,如果我们想有效地使用STL,我们就必须与它们和平共处。
幸运的是,这很容易做到。如果有一个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]则试图产生一个指针,而该指针指向的东西并不存在。这可不好,所以需要先判断一下,确保安全。
上述得到容器中指针的方式对于vector是适用的,但对于string却是不可靠的。因为(1)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());
- 如何把vector和string数据传给旧的C API
- effective stl 第16条: 了解如何把vector和string数据传给旧的API
- 了解如何把vector和string数据传给旧的API
- Effective STL:Item 16:如何将vector和string的数据传给传统的API函数
- 条款16: 如何将vector和string的数据传给遗留的API
- Effective STL: 将vector和string的数据传给历史遗留的C风格API
- Effective STL: 将vector和string的数据传给历史遗留的C风格API
- 《Effective STL》读书笔记八:Item 15:意识到string的不同实现 Item 16:如何将vector和string的数据传给老的API函数
- 如何将vector 和 string 传递给 类C的API
- 如何把C++成员函数的地址传给C
- 如何将c结构数据传给lua
- 如何将c结构数据传给lua
- 如何把store里的所有数据转换成JSON传给后台
- 如何把Ext.data.store里的数据一次性用JSON传给后台(添加了后台解析部分)
- 如何把Ext.data.store里的数据一次性用JSON传给后台(添加了后台解析部分)
- 如何将c结构数据传给lua(转)
- c和c++如何把一个整数转化为string
- 如何把图片转为二进制传给服务器
- NO.1去掉最大值、最小值之后剩下的个数
- MFC 子对话框创建
- Swift2.2
- JSP bug1
- tinyXML实战
- 如何把vector和string数据传给旧的C API
- 置:重置“结果”的内容 20140624
- Android 拷贝数据库文件
- 怎么做才是好的IT榜样?
- 黑马程序员_OC学习之@property、点语法
- C++实现TCP通信。。
- java的class文件反编译和Eclipse、MyEclipse反编译插件安装、使用
- [LeetCode65]Pascal's Triangle II
- jsp速度优化七种方法