通常情况下。旧的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的更多相关文章

  1. 【S16】了解如何把vector和string数据传给旧的API

    1.尽量使用vector和string替换数组,但是老的代码还是使用数组.如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址. 2.考虑方法Do ...

  2. STL学习笔记(二) vector和string

    条款13:vector.string优先于动态分配数组 string是basic_string<char>的类型定义许多string的背后实现都采用了引用计数的技术,可以消除不必要的内存拷 ...

  3. 《条目十六》如何将vector和string的数据传给遗留的API

    <条目十六>如何将vector和string的数据传给遗留的API 优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失.然而,也不 ...

  4. 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案

    后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440. 解决方法: ...

  5. IE8下导入EXCEL数据传到客户端以附件下载

    IE8下导入EXCEL数据传到客户端以附件下载方式出现,而不显示数据,解决方法:以text/html格式返回. HttpResponseMessage message = new HttpRespon ...

  6. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  7. 【S13】vector和string优先于动态分配的内存

    1.使用new动态分配内存,必须承担如下责任: a.使用delete释放内存: b.确保使用了正确的形式,delete与new的形式要匹配: c.不能重复delete. 2.使用vector和stri ...

  8. C++ 实现vector<std:string> 版本

    #include <iostream> #include <vector> #include <memory> #include <thread> #i ...

  9. struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?

    struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的? 解答: 1)可以直接通过与表单元素相同名称的数据成员(需要存在符合命名规范set和get ...

随机推荐

  1. hdu 5428 质因子

    问题描述有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个 ...

  2. 发送统计邮件shell脚本

    #!/bin/bash#作者:Presley#时间:2018.07.16#监控阿里云aaa库的py_weixin_product_close_rating_info 和 py_weixin_produ ...

  3. NAT虚拟网络配置

     NAT虚拟网络配置(Linux能上网) 1.先设置虚拟机的虚拟网络,设置里面的子网ip和网关ip地址: 有两种方式:①setup命令(不选DHCP,因为它是动态分配IP地址的) ②vi /etc/s ...

  4. jQuery-Selectors(选择器)的使用(二、层次篇)(转载)

    原文:http://www.cnblogs.com/bynet/archive/2009/12/01/1614405.html 本系列文章导航 jQuery-Selectors(选择器)的使用(一.基 ...

  5. python 函数式编程学习笔记

    函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...

  6. NUMA导致的MySQL服务器SWAP问题分析与解决方案

    [SWAP产生原理] 先从swap产生的原理来分析,由于linux内存管理比较复杂,下面以问答的方式列了一些重要的点,方便大家理解: 1.swap是如何产生的 swap指的是一个交换分区或文件,主要是 ...

  7. SmartSVN11 Mac版 注册码序列号

    Name=apipostAddress=1337 iNViSiBLE Str.Email=3257132998@qq.comFreeUpdatesUntil=2099-09-26LicenseCoun ...

  8. 初识thinkphp(3)

    这篇内容主要涉及请求相应内容. 该系列主要是个人笔记,且内容是连贯的,其中涉及到的自己写的模块或者方法在前面文章中有介绍咋来的,如果您看得云里雾里,给您带来不便,真的不好意思. 0x01:请求对象 官 ...

  9. 手动搭建ABP2.1.3——基础框架

    一.基础层搭建 1,创建一个空解决方案 2,层结构 Demo.Core[v:4.6.1]:类库 Demo.EntityFramework[v:4.6.1]:类库(引用Demo.Core) Demo.A ...

  10. javascript相关基础

    1.javascript:void(0) javascript:void(0)表示不做任何动作 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. <a hr ...