已经存在的遗留的 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相关推荐

  1. 电脑安装python3.74_python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发

    Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发 Polyworks支持C#二次开发,用对应的SDK文档试着做一下开发样例. 新建一个C#项目,在解决方案中右键添加引用 ...

  3. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  4. C语言结构体变量和结构体数组-学习笔记(十六)

    一.结构体变量 1.结构体概念 将不同类型的数据组合成一个有机的整体即为结构体.结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型. 2.结构体类型及结构体变量定义 (1)结构体类型声明 ...

  5. 【theano-windows】学习笔记十六——深度信念网络DBN

    前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(dee ...

  6. MonoRail学习笔记十六:AJax在MonoRail中的使用

    AJax几乎成了web2.0的一个代表,Java和Asp.net中都提供了一些AJax操作的控件.在MonoRail中也同样提供了AJax操作的共通类:AJaxHelper AJaxHelper可以指 ...

  7. JavaScript权威设计--CSS(简要学习笔记十六)

    1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...

  8. Jenkins deploy to container部署war到tomcat(学习笔记十六)

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...

  9. IOS学习笔记十六(NSString和NSMutableString)

    1.NSString和NSMutableString NSString是不变字符串类,有点像java里面的String,NSMutableString是可变字符串类,有点类似java里面的String ...

  10. 最优化学习笔记(十六)——拟牛顿法(2)

    Hessian矩阵逆矩阵的近似 一.拟牛顿法的基本思路 令H0,H1,H2,-\boldsymbol{H_0,H_1, H_2}, \dots表示Hessian矩阵逆矩阵F(x(k))−1\bolds ...

最新文章

  1. 泛在电力物联网(能源互联网+物联网)浅析
  2. maven的pom.xml用<exclusion>解决版本问题
  3. Python笔记_第四篇_高阶编程_正则表达式_3.正则表达式深入
  4. Unity发布WebGL时如何修改默认的载入进度条sf?
  5. Java的setmargin,Java Sheet.setMargin方法代碼示例
  6. kubernetes1.8.4安装指南 -- 3. 安装docker ce
  7. java txt 按行读取_java读取按行txt文件
  8. u8转完看不到菜单_web网页有错误,无法看到操作菜单-用友U8
  9. 10打开没有反应_118个遇水反应化学品清单及高压反应釜操作经验
  10. 回应UE4 Unity将很快让开发者在虚拟现实里构建虚拟现实
  11. HDU - 3506 Monkey Party
  12. 超实用的JavaScript代码段 Item1 --倒计时效果
  13. SonarQube 7.7默认数据库连接方法
  14. Beginning Python chapter 1 Instant Hacking The Basics 2: Comments Strings
  15. 7种方案,彻底实现Python可视化图片大小/分辨率控制自由
  16. 华为android怎么打开usb调试,华为PLK-AL10 开启USB调试模式
  17. 【奥特曼迪迦表情包】
  18. OpenCV38:特征匹配
  19. 将本地项目上传到码云,只需这几步,每个步骤都有图文
  20. 异质信息网络表征学习综述

热门文章

  1. SPSS统计检验中的边缘显著及其转化处理【SPSS 063期】
  2. ai人工智能软件_您应该了解的5家创新AI软件公司
  3. YOLOv5与Faster RCNN相比。 谁赢?
  4. Serilog输出日志到mysql_ASP.NET Core利用Docker ElasticSearch Kibana来记录日志
  5. 如何获取中间层的结果_如何从0开始做大数据治理(上)
  6. android compare方法,如何的CompareTo或在Android Studio中
  7. C语言编写——四则运算小游戏
  8. python itchat模块登录失败_itchat模块的不明错误
  9. 名字正则只能是中文英文_【R语言新书】1.5 正则表达式
  10. PCA,ZCA,ICA,白化,稀疏编码和自编码器