怎样把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 ...
随机推荐
- hdu 1700 (圆的内接三角形 要周长最大)
以原点为圆心,给出圆上的一点,要求圆上的另外两点,使得这三个点的距离和最大,很容易想到这是一个等边三角形然后有这两个公式 点a为已知点a*b=|a|*|b|*cos(120); x*x+y*y=r*r ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- 010 使用jquery实现小需求练习-------对应选择器的练习
1.需求 点击所有的 p 节点, 能够弹出其对应的文本内容 使第一个 table 隔行变色 点击 button, 弹出 checkbox 被选中的个数 2.程序 <!DOCTYPE html&g ...
- Selenium Webdriver概述(转)
Selenium Webdriver https://www.yiibai.com/selenium/selenium_overview.html# webdriver自动化俗称Selenium 2. ...
- 009.Zabbix幻灯片展示
一 Slide shows简介 Slide shows在多个Screens之间以幻灯片的方式来展示,使一个屏幕可以显示多个页面. 二 Slide shows配置 2.1 创建多个Screen Slid ...
- shell 父子传值
通过一个中间文件进行: #!/bin/bash ( subvar="hello shell" echo "$subvar" > temp.txt ...
- Android中线程通信的方式
Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...
- http://blog.mn886.net/jqGrid/
http://blog.mn886.net/jqGrid/ 中文版 http://www.trirand.com/blog/jqgrid/jqgrid.html 英文版
- faker php测试数据库生成2
因内容太长,被csdn截断了,只好把另外的内容写到这里. //Biased // 在10到20之间得到一个随机数字,有更大的几率接近20 echo $faker->biasedNumberBet ...
- Scrum:The Definition of Done —— 作业有没有写完呢?
Scrum:The Definition of Done -- 作业有没有写完呢?_苗得雨_新浪博客 http://blog.sina.com.cn/s/blog_59450ffc0102eiai.h ...