怎样把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 ...
随机推荐
- IntelliJ IDEA快捷键:Ctrl+空格
The Code Completion feature lets you quickly complete different kinds of statements in the code.For ...
- IE下css bug集合-翻译自haslayout.net
概述IE浏览器以不支持大量的css 属性出名,同时也因其支持的css属性中存在大量bug. 本页列举了IE下的一些问题,实例样本和一些我们已知的解决方法. 尽管我已经尽力按照它们本来的性质对它们进行分 ...
- RocketMQ 部署
1. 下载 下载RocketMQwget https://github.com/alibaba/RocketMQ/releases/download/v3.2.6/alibaba-rocketmq-3 ...
- node编写自己的cli
用node编写自己的cli工具 工作中接到新项目,开发前都需要先规划项目目录,然后一个个创建文件,搭建sass编译环境,下载jquery,Swiper等类库... 这些准备工作都要花上不少时间.每 ...
- P1164 小A点菜 洛谷
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...
- HTML、CSS、JS 样式 (未整理)
随手记,有错误的地方希望留言 ^.-.^ PHP 实现关闭浏览器窗口echo "<script>window.close();</script>"; jqu ...
- [java] DOS编译 .java 文件得到 .class 文件 并执行 以及使用外部 .jar包 时的命令
当写一个java文件后,在DOS中进行编译与执行时,如果没有引入外来的包,那情况很简单 例如: public class hello_world { public static void main(S ...
- MATLAB遍历文件夹下所有文件
先给出函数 function [ files ] = scanDir( root_dir ) files={}; if root_dir(end)~='/' root_dir=[root_dir,'/ ...
- 001.YUM源服务端搭建
一 前期准备 1.1 地址规划 主机名 IP地址 备注 mirrors 172.24.8.71/24 yum服务器,与互联网同步 client 172.24.8.72/24 内部客户端 1.2 架构示 ...
- 开发一个简单的babel插件
前言 对于前端开发而言,babel肯定是再熟悉不过了,工作中肯定会用到.除了用作转换es6和jsx的工具之外,个人感觉babel基于抽象语法树的插件机制,给我们提供了更多的可能.关于babel相关概念 ...