Effective_STL 学习笔记(十六) 如何将 vector 和 string 的数据传给遗留的API
已经存在的遗留的 C 风格 API 接受的是数组和 char* 指针,这样的 API 函数还将会存在很长时间,如果我们要有效使用 STL 的话,就必须和它们和平共处。
如果有一个 vector 对象 v,而你需要一个指向 v 中数据的指针,以使得它可以被当作一个数组,只要 &v[0] 就可以了。对于 string 对象 s,相应的使用 s.c_str()
1 void doSomething( const int* pInts, size_t numInts ); 2 doSomething( &v[0], v.size() );3 void doSomething( const char* pString ); 4 doSomething( s.c_str() );
对于 vector 使用不要使用 v.begin() 代替 &v[0],v.begin() 是迭代器,不是指针,一定要使用的话,键入&*v.begin()
string 的成员函数 c_str() 返回一个按 C 风格设计的指针,指向 string 的值
两种形式下,指针都被传递为指向 const 的指针
1 void doSomething( const int* pInts, size_t numInts ); 2 void doSomething( const cahr* pString );
vector 和 string 只能传给只读取而不修改它的API,对于 string 来说是唯一可做的,对于 vector 相对灵活一点。
如果想用 C 风格API返回的元素初始化一个 vector,可以利用 vector 和数组潜在的内存分配兼容性将存储 vector 的元素空间传给API函数:
1 // C API:此函数需要一个指向数组的指针,数组最多有 arraySize 个 double 2 // 而且会对数组写入数据。它返回写入的 double 数,不会大于 arraySize3 size_t fillArray( double* pArray, size_t arraySize ); 4 vector<double> vd( maxNumDoubles ); // 建立一个 vector,大小是 maxNumDoubles 5 vd.resize( fillArray( &vd[0], vd.size() ) ); // 写入vd,然后调整 vd 的大小为fillArray
这个技巧只能工作于vector,因为只有vector承诺了与数组具有相同的潜在内存分布。
如果想用C风格 API 初始化 string 对象,只要让 API 将数据放入一个 vector<char>,然后再从 vector 中将数据拷到 string:
1 // C API:此函数需要一个指向数组的指针,数组最多有 arraySize 个 char 2 // 而且会对数组写入数据。它返回写入的 char 数,不会大于 arraySize 3 size_t fillString( char* pArray, size_t arraySize ); 4 vector<char> vc( maxNumChars ); // 建立一个 vector 5 size_t charsWritten = fillString( &vc[0], vc.size() );// 让 fillString 把数据写入 vc 6 string s( vc.begin(), vc.end() + charsWritten ); // 从 vc 通过范围构造函数拷贝数据到s
事实上,让 C 风格 API 把数据放入一个 vector,然后拷到你实际想要的 STL 容器中总是有效的:
1 size_t fillString( double* pArray, size_t arraySize ); 2 vector<double> vd( maxNumDoubles ); 3 vd.resize( fillArray( &vd[0], vd.size() ) ); 4 5 deque<double> d( vd.begin(), vd.end() ); // 拷贝数据到 deque 6 list<double> d( vd.begin(), vd.end() ); // 拷贝数据到 list 7 set<double> d( vd.begin(), vd.end() ); // 拷贝数据到 set
此外,对于 vector 和 string 以外的 STL 容器如何将他们的数据传给 C 风格 API。只要将容器的每个数据拷到 vector,然后将它们传给API:
void doSomething( const int* pints, size_t numInts );set<int> intSet;. . .vector<int> v( intSet.begin(), intSet.end() ); // 拷贝 set 数据到 vectorif( !v.empty() ) doSomething( &v[0], v.size() ); // 传递数据到 API
转载于:https://www.cnblogs.com/kidycharon/p/10009981.html
Effective_STL 学习笔记(十六) 如何将 vector 和 string 的数据传给遗留的API相关推荐
- 电脑安装python3.74_python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发
Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发 Polyworks支持C#二次开发,用对应的SDK文档试着做一下开发样例. 新建一个C#项目,在解决方案中右键添加引用 ...
- Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现
之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...
- C语言结构体变量和结构体数组-学习笔记(十六)
一.结构体变量 1.结构体概念 将不同类型的数据组合成一个有机的整体即为结构体.结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型. 2.结构体类型及结构体变量定义 (1)结构体类型声明 ...
- 【theano-windows】学习笔记十六——深度信念网络DBN
前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(dee ...
- MonoRail学习笔记十六:AJax在MonoRail中的使用
AJax几乎成了web2.0的一个代表,Java和Asp.net中都提供了一些AJax操作的控件.在MonoRail中也同样提供了AJax操作的共通类:AJaxHelper AJaxHelper可以指 ...
- JavaScript权威设计--CSS(简要学习笔记十六)
1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...
- Jenkins deploy to container部署war到tomcat(学习笔记十六)
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...
- IOS学习笔记十六(NSString和NSMutableString)
1.NSString和NSMutableString NSString是不变字符串类,有点像java里面的String,NSMutableString是可变字符串类,有点类似java里面的String ...
- 最优化学习笔记(十六)——拟牛顿法(2)
Hessian矩阵逆矩阵的近似 一.拟牛顿法的基本思路 令H0,H1,H2,-\boldsymbol{H_0,H_1, H_2}, \dots表示Hessian矩阵逆矩阵F(x(k))−1\bolds ...
最新文章
- 泛在电力物联网(能源互联网+物联网)浅析
- maven的pom.xml用<exclusion>解决版本问题
- Python笔记_第四篇_高阶编程_正则表达式_3.正则表达式深入
- Unity发布WebGL时如何修改默认的载入进度条sf?
- Java的setmargin,Java Sheet.setMargin方法代碼示例
- kubernetes1.8.4安装指南 -- 3. 安装docker ce
- java txt 按行读取_java读取按行txt文件
- u8转完看不到菜单_web网页有错误,无法看到操作菜单-用友U8
- 10打开没有反应_118个遇水反应化学品清单及高压反应釜操作经验
- 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
- HDU - 3506 Monkey Party
- 超实用的JavaScript代码段 Item1 --倒计时效果
- SonarQube 7.7默认数据库连接方法
- Beginning Python chapter 1 Instant Hacking The Basics 2: Comments Strings
- 7种方案,彻底实现Python可视化图片大小/分辨率控制自由
- 华为android怎么打开usb调试,华为PLK-AL10 开启USB调试模式
- 【奥特曼迪迦表情包】
- OpenCV38:特征匹配
- 将本地项目上传到码云,只需这几步,每个步骤都有图文
- 异质信息网络表征学习综述
热门文章
- SPSS统计检验中的边缘显著及其转化处理【SPSS 063期】
- ai人工智能软件_您应该了解的5家创新AI软件公司
- YOLOv5与Faster RCNN相比。 谁赢?
- Serilog输出日志到mysql_ASP.NET Core利用Docker ElasticSearch Kibana来记录日志
- 如何获取中间层的结果_如何从0开始做大数据治理(上)
- android compare方法,如何的CompareTo或在Android Studio中
- C语言编写——四则运算小游戏
- python itchat模块登录失败_itchat模块的不明错误
- 名字正则只能是中文英文_【R语言新书】1.5 正则表达式
- PCA,ZCA,ICA,白化,稀疏编码和自编码器