《条目十六》如何将vector和string的数据传给遗留的API
《条目十六》如何将vector和string的数据传给遗留的API
优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失。然而,也不必为了系统的稳定而抛弃先进和方便的技术。
正如如果你想在遗留的老代码中想传vector和string给形参是数组的接口,那么可以按以下的方法做:
接口:void dosomething(const char* ptr, size_t size);
传vector给dosomething接口方法:
- 1、&vec[0]———————-可行
- 2、vec.begin()—————不正确
- 3、&*vec.begin()————可行
方法1是ok,这是因为vector在内存上是连续分布的,和数组的内存分布是一致的,所以对vector的首元素取地址就是获得vector分配内存的首地址,通过首地址就可以得到连续的整块内存。
但是需要注意的是,vecto可能为空的情况,这样传参过去,形参是null, size为0,这样是错误的。可以在调用函数的时候就判断vector是否非空。
if(!vec.empty())
{
dosomething(&vev[0], vec.size());
}
这才是标准的做法。
方法2是不正确的,这样做可能是因为有人觉得vec.begin()得到的是指向vector容器的首地址的迭代器,就相当于是容器的地址。这里有个误区,迭代器不是指针,二者并非是等价的。
方法3是正确的,对比方法2,方法3先取得容器的首个元素的迭代器,然后解引用获得首个元素,再对其取地址。这样就等同于&vec[0]。
传string给dosomething接口方法:
- 1、
s.c_str()——————正确 - 2、
&s[0]——————————错误 - 3、
&*vec.begin()————错误
string传参给char*需要注意了,由于string的实现是多种多样的,string对象的首个地址并非一定是字符串值的地址,详细的请看条目15的分析。所以直接传递string的首元素的地址过去都是不正确,不管是直接对首元素取地址还是对取迭代器起始位置的解引用的地址,统统都不正确。
正确的做法是方法1,直接调用string.c_str()接口,直接帮我们实现string传参给char*。
通过上面的分析知道,vector可以很好的帮助我们实现容器传参给char*的目的。从这可以展开来,可以把所有的容器先转换为vector,然后再传递给以char*的形参的老接口。
但是在传递容器类型给以指针为形参的遗留API时需要注意,基本是传递const类型的,因为在函数内部对外部容器新增元素,容器是不知道它的size会发生变化的,因为不是通过容器本身改变新增元素,内部没有对size自增的,所以size真正没有改变。所以这样会造成容器数据的混乱,发生未定义行为。
上面举例子的都是以char*为例子,真正情况下任何的基本类型的指针都是可以的。
看下面的例子:
void dosomething(const int* ptr, size_t size);
set<int> set;
for(int i = 0; i < 10; ++i)
{
set.insert(i);
}
vector<int> vec1(set.begin(), set.end());
if(!vec1.empty())
{
dosomething(&vec1[0], vec1.size());
}
list<int> list;
for(int i = 0; i < 10; ++i)
{
list.push_back(i);
}
vector<int> vec2(list.begin(), list.end());
if(!vec2.empty())
{
dosomething(&vec2[0], vec2.size());
}
《条目十六》如何将vector和string的数据传给遗留的API的更多相关文章
- 条目十三《尽量使用vector和string来代替使用数组》
条目十三<尽量使用vector和string来代替使用数组> 数组在现代编程语言中基本都存在,应用可谓广泛,不可或缺,虽然在一些语言中(go)有切片等数据结构,但是数组还是存在的. 但是在 ...
- 【S16】了解如何把vector和string数据传给旧的API
1.尽量使用vector和string替换数组,但是老的代码还是使用数组.如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址. 2.考虑方法Do ...
- robotframework的学习笔记(十六)----robotframework标准库String
官方文档:http://robotframework.org/robotframework/latest/libraries/String.html Introduction A test libra ...
- (十六)java中的String
String:字符串类型,是java中最常用的引用类型,String是不可变的,java.lang.String是由final修饰,此类不可被继承. String是不可变的,指的是字符串一旦创 ...
- 【第十六章】 springboot + OKhttp + String.format
模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...
- kuangbin专题十六 KMP&&扩展KMP HDU3347 String Problem(最小最大表示法+kmp)
Give you a string with length N, you can generate N strings by left shifts. For example let consider ...
- leecode第十六题(最接近的三数之和)
class Solution { public: void quick_order(vector<int>& num, int star, int en)//快排 { int st ...
- LeetCode第十六题-找出数组中三数之和最接近目标值的答案
3Sum Closest 问题简介: 给定n个整数的数组nums和整数目标,在nums中找到三个整数,使得总和最接近目标,返回三个整数的总和,可以假设每个输入都只有一个解决方案 举例: 给定数组:nu ...
- JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较
JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...
随机推荐
- Lecture Sleep(前缀和)
Your friend Mishka and you attend a calculus lecture. Lecture lasts n minutes. Lecturer tells ai the ...
- Idea的基本介绍
Idea的基本介绍 Idea一般是作为一个Java和Scala的开发工具来使用的,它的使用方法和Eclipse有一些不同,这里记录以下一些基本点. 1.创建项目 创建一个新项目的时候,用户必须选择一个 ...
- Java基础知识(二)之控制语句
1.条件运算符 ⑴if...else... ⑵三目表达式——X?Y:Z 当X为真时,结果为Y:反之,为Z. ⑶switch(表达式){ case 1: 执行代码块 1; break: cas ...
- Pacemaker实现双机热备
在互联网高速发展的今天,尤其在电子商务的发展,要求服务器能够提供不间断服务.在电子商务中,如果服务器宕机,造成的损失是不可估量的.要保证服务器不间断服务,就需要对服务器实现冗余.在众多的实现服务器冗余 ...
- vim 的小幅移动
1.操作符命令和位移 x --->删除一个字符,4x ---->删除4个字符. dw --->可以删除一个单词,d4w ---->删除4个单词. d$ ----> 删除 ...
- WebFlux01 webflux概念、异步servlet、WebFlux意义
1 概念 待更新...... 2 异步servlet 2.1 同步servlet servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,se ...
- 安装 SQL Server 2014 Express
安装 SQL Server 2014 Express 我的电脑系统: Windows 10 64位 一 . 下载 安装Microsoft SQL Server 2014 Express 软甲下载地址: ...
- 17.SQL 约束
约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约束: NOT ...
- SQL Server 时间类型转换函数
cast ( expression as data_type(length))convert ( data_type (length), expression, style) //如果未指定 leng ...
- css总结5:px、em、rem区别介绍
1 PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. PX特点 1. 浏览器无法调整px单位的字体,以em或rem为字体单位可调整字体. 2 EM em是相对长度单 ...