怎样把vector和string数据传给旧的C API
通常情况下。旧的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());
怎样把vector和string数据传给旧的C API的更多相关文章
- 【S16】了解如何把vector和string数据传给旧的API
1.尽量使用vector和string替换数组,但是老的代码还是使用数组.如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址. 2.考虑方法Do ...
- STL学习笔记(二) vector和string
条款13:vector.string优先于动态分配数组 string是basic_string<char>的类型定义许多string的背后实现都采用了引用计数的技术,可以消除不必要的内存拷 ...
- 《条目十六》如何将vector和string的数据传给遗留的API
<条目十六>如何将vector和string的数据传给遗留的API 优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失.然而,也不 ...
- 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案
后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440. 解决方法: ...
- IE8下导入EXCEL数据传到客户端以附件下载
IE8下导入EXCEL数据传到客户端以附件下载方式出现,而不显示数据,解决方法:以text/html格式返回. HttpResponseMessage message = new HttpRespon ...
- vector、string实现大数加法乘法
理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...
- 【S13】vector和string优先于动态分配的内存
1.使用new动态分配内存,必须承担如下责任: a.使用delete释放内存: b.确保使用了正确的形式,delete与new的形式要匹配: c.不能重复delete. 2.使用vector和stri ...
- C++ 实现vector<std:string> 版本
#include <iostream> #include <vector> #include <memory> #include <thread> #i ...
- struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?
struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的? 解答: 1)可以直接通过与表单元素相同名称的数据成员(需要存在符合命名规范set和get ...
随机推荐
- 【BZOJ】3456: 城市规划(多项式求ln)
题解 在我写过分治NTT,多项式求逆之后 我又一次写了多项式求ln 我们定义一个数列的指数型生成函数为 \(\sum_{i = 0}^{n} \frac{A_{i}}{i!} x^{i}\) 然后这个 ...
- 【noip模拟赛1】古韵之刺绣
描述 日暮堂前花蕊娇, 争拈小笔上床描, 绣成安向春园里, 引得黄莺下柳条. ——胡令能<咏绣障> 古时女子四德中有一项——女红.女红的精巧程度对于女子来说是十分重要的.韵哲君十分爱好女红 ...
- Android SDK platforms build-tools等镜像下载
Android SDK platforms build-tools等镜像下载 下载地址:http://mirrors.neusoft.edu.cn/android/repository/ 这 ...
- hdu4055
hdu4055 题意 给出一个长度为 n - 1 的字符串,要求构造一个包含数字 [1, n] 的排列,从第二位开始,'I' 表示当前位数字比前一位大,'D' 表示当前位数字比前一位小,'?' 表示可 ...
- scheme的split实现
再chez中并未找到一个split函数,基于尾递归,自己实现了了一个用于字符串拆分的split. (define split (lambda (str sep) (define loop (lambd ...
- Fisher–Yates shuffle 洗牌算法(zz)
1,缘起 最近工作上遇到一个问题,即将一组数据,比如[A,B,C,D,E]其中的两个B,E按随机排列,其他的仍在原来的位置: 原始数组:[A,B,C,D,E] 随机字母:[B,D] 可能结果:[A,B ...
- CCCC 成都信息工程大学游记
晚上刷智障25人本,刷到深夜四点,然后迷迷糊糊8点钟起床上车睡觉,然后就到了信息工程大学. 然后开始抢衣服,抢完衣服就开始拍照. 对了,这个学校看了下地图,好小呀,不过妹子好多呀. 然后就被老师带进机 ...
- android 的几个黄色警告解决办法(转)
转自:http://my.eoe.cn/864234/archive/5162.html 1:Handler 1 2 3 4 5 6 7 8 // This Handler class should ...
- CENTOS下搭建SVN服务器(转)
1.安装svn yum install -y subversion 2.验证安装是否成功 svnserve --version 3.创建svn版本库 mkdir svn svnadmin create ...
- 浅谈BFC和IFC
先说说FC,FC的含义就是Fomatting Context.它是CSS2.1规范中的一个概念. 它是页面中的一块渲染区域.而且有一套渲染规则,它决定了其子元素将怎样定位.以及和其它元素的关系和相互作 ...