zoukankan      html  css  js  c++  java
  • 【S16】了解如何把vector和string数据传给旧的API

    1、尽量使用vector和string替换数组,但是老的代码还是使用数组。如果老的接口期望是数组,怎么办?
      需要把vector和string,暴露出数组接口,也就是第一个元素的地址。

    2、考虑方法DoSomething(const int* pInt,size_t size),对于vector<int> vec,调用如下:
      DoSomething(&vec[0], v.size());
      这里有个问题,vec的大小可能为0,更安全的做法是:
      if(!vec.empty())
      {
        DoSomething(&vec[0], v.size());
      }

    3、考虑,能不能使用begin()替换&vec[0]?
      我们知道,begin返回迭代器,是对指针的封装,类似于指针。但是,不能把迭代器当成指针使用,可以使用&*begin(),这种方式与&vec[0]等价,显然&vec[0]更直观。

    4、考虑DoSomething(const char* pa); 对于string str,调用如下:
      DoSomething(str.c_str());
      c_str返回一个char指针,指向字符串值,尾部再加一个空字符。str长度可以为0,返回空字符,内部也可以包含空字符。但是,DoSomething的处理是以第一个空字符作为结束。
    5、vector暴露出指针,调用端修改元素的值,通常没有问题。但是不能增加新元素。因为在外部增加新元素,vector不知道,不去更新size,size产生不正确的结果。如果大小和容量相等,增加元素就会踩内存了。注意:对于排序的vector,修改vector的元素值,也会产生问题。因为修改元素值后,导致vector无序。

    6、考虑C API数组初始化vector,很简单。如果C API数组初始化string呢?
      可以先初始化vector<char>,vector<char>再去初始化string。当然,还可以解决更一般化的问题。先把C API数组写到vector,再把vector写到期望的STL容器中。对于逆向的转化,同样道理。先把STL容器的元素写到vector,再把vector传递给C API数组。也就是说,vector是一个适配器。

  • 相关阅读:
    数据泵导出 备份文件以日期时间命名
    执行计划的查看
    truncate 函数用法示例
    几个小知识点
    删除大表数据
    转 oracle 11g 导出空表
    数值转为财务大写
    oracle 取随机数据
    大表 update 方式
    >hibernate.cfg.xml的一些常用配置
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3657220.html
Copyright © 2011-2022 走看看