`
king_c
  • 浏览: 213817 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

vector 转换成 数组 - [C++]

阅读更多

 

参考:

 

http://topic.csdn.net/t/20050429/20/3976956.html

 

不过那边是转载自《effective stl》。

 

    std::vector很方便,但有时调用的函数的参数规定是数组,需要将vector转为数组,另外开辟一个空间,将vector一项项复制过去代价过大,可用下面的方法。

 

给定一个

 

vector<int>   v;  
      表达式v[0]生产一个指向vector中第一个元素的引用,所以,&v[0]是指向那个首元素的指针。vector中的元素被C++标准限定为存储在连续内存中,就像是一个数组,所以,如果我们想要传递v给这样的C风格的API:  
   
  void   doSomething(const   int*   pInts,   size_t   numInts);  
  我们可以这么做:    
   
  doSomething(&v[0],   v.size());  
  也许吧。可能吧。唯一的问题就是,如果v是空的。如果这样的话,v.size()是0,而&v[0]试图产生一个指向根本就不存在的东西的指针。这不是件好事。其结果未定义。一个较安全的方法是这样:  
   
  if   (!v.empty())   {  
  doSomething(&v[0],   v.size());  
  }  
   
  如果你在一个不好的环境中,你可能会碰到一些半吊子的人物,他们会告诉你说可以用v.begin()代替&v[0],因为(这些讨厌的家伙将会告 诉你)begin返回指向vector内部的迭代器,而对于vector,其迭代器实际上是指针。那经常是正确的,但正如条款50所说,并不总是如此,你 不该依赖于此。begin的返回类型是iterator,而不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin。如果你基 于某些原因决定键入v.begin(),就应该键入&*v.begin(),因为这将会产生和&v[0]相同的指针,这样可以让你有更多 的打字机会,而且让其他要弄懂你代码得人感觉到更晦涩。坦白地说,如果你正在和告诉你使用v.begin()代替&v[0]的人打交道的话,你该 重新考虑一下你的社交圈了。(译注:在VC6中,如果用v.begin()代替&v[0],编译器不会说什么,但在VC7和g++中这么做的话, 就会引发一个编译错误)  

 

举个例子

不必复制数据。
std::vector,内部存储的所有元素,都是占用一片连续的内存空间。因此,比较好的做法就是直接取第一个元素的地址,得到了首地址,之后的做法与数组也是大同小异了。



举例说明。
假设函数Func需要以数组的方式传递,函数原型如下:
void Func(double* pDataAddress, size_t nDataCount);

那么,如果使用数组,调用的方法如下:
double data[30];
Func(data, 30);

而使用vector,调用的方法如下:
std::vector<double> data(30);
Func(&data[0], data.size());


需要注意的地方:
1、如果vector长度为零,那就不能取得第一个元素的地址。因为此时第一个元素还不存在。程序注意判断。
2、如果vector的长度变长(例如:不停地进行push_back),那可能导致之前取得的地址变为无效。为了安全,每次进行push_back, insert, assign之类的操作之后,就需要重新取得第一个元素的地址。因为之前取得的地址可能已经无效了。

 

 

分享到:
评论

相关推荐

    -C++参考大全(第四版) (2010 年度畅销榜

    24.4 vector容器 24.5 list容器 24.6 map容器 24.7 算法 24.8 使用函数对象 24.9 string类 24.10 关于STL的最后一点说明 第三部分 标准函数库 第25章 基子C的输入/输出函数 25.1 clearerr函数 25.2 fclose函数 ...

    【全新正版】现代C++程序设计(原书第2版)

    6.4.4 C++中提供的字符数组函数 6.5 多维数组 6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二维...

    C语言代码和C++代码--指针、多线程、文件读写、套接字

    C语言代码和C++代码--vs2008从指针到多线程、文件读写、套接字 ...C++_07_2模板vector 网络通信_test MFC_线程_test socket 服务端和客户端--网上的例子1 类、多线程、套接字(服务端) 类、多线程、套接字(客户端)

    C++ STL开发技术导引(第5章)

    1.6 显式类型转换 9 1.7 异常处理 13 1.8 名字空间 17 1.9 友员函数 20 1.10 内联函数 21 1.11 静态成员 22 1.12 本章小结 23 第2章 C++模板技术 25 2.1 函数模板 25 2.2 类模板 27 2.3 模板...

    现代C++程序设计

    6.4.4 C++中提供的字符数组函数 6.5 多维数组 6.5.1 二维数组的初始化 6.5.2 嵌套的for循环和二维数组 6.5.3 利用二维数组来实现Bingo游戏 6.6 多维数组和函数 6.6.1 改进的Bingo卡片程序 6.6.2 白雪公主:利用二...

    Array 和 WriteOnlyArray (C++-CX).pdf

    你可以在 C++/CX 程序中自由使用常规 C 样式数组或 std::array(尽管 std::vector 通常是更好的选择),但是,在元数据内发布的任何 API 中,必须将 C 样式数组或向量转换为 Platform::Array 或 Platform::...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    16.2.2 C++中的模板类vector和 basic_string 478 16.3 模板和继承 478 第17章 链式数据结构 487 17.1 节点和链表 487 17.1.1 节点 487 17.1.2 链表 491 17.1.3 向链表头插入一个节点 492 17.1.4 向链表中...

    非常经典的c++ primer视频教程6-10

    本课程是C++ Primer初级教程,课程内容是学习C++语言基础知识,对应着教材的第1章到第8章。 第1章 快速入门 1.1 编写简单的C++程序 1.2 初窥输入/输出 1.2.1 标准输入与输出对象 1.2.2 一个使用IO库的程序 ...

    C和C++头文件对比一览

    #include &lt;vector&gt; //STL 动态数组容器 #include #include using namespace std; ////////////////////////////////////////////////////////////////////////// C99 增加 #include &lt;complex.h&gt; //复数处理 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 ...

    计算机考研复试:C++实现进制转换,包括二,十,十六之间相互转换

    运用到了STL中的vector,实现动态数组。

    C_C++问题总结

    3.17 C++转换机制(static_cast、dynamic_cast、reinpreter_cast、 const_cast) 3.18 深拷贝和浅拷贝 3.18 动态绑定和静态绑定 3.19 实现不能在堆、栈分配的类,不能被继承的类 3.20 堆和栈 3.20.1 程序内存分配 ...

    Ubuntu Linux 下C调用C++类,使用Cmake编译 下载即可编译,gcc g++

    c主函数调用C++类,包含中间转换层,下载即可用。C++类为vector数组,可指定数插入和随机数插入,并进行排序,均转换成c可调用。

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    C++Primer视频(初级)下载地址

    第7章参数传递-vector和其他容器类型的形参 60.第7章参数传递-数组形参 61.第7章main处理命令行选项 62.第7章return语句 63.第7章递归 64.第7章函数声明 65.第7章局部对象 66.第7章内联函数 67.第7...

    本人精心收集,c++头文件一览

    本人收集: C/C++头文件一览 C、传统 C++ #include &lt;... //整数格式转换 #include &lt;stdbool.h&gt; //布尔环境 #include &lt;stdint.h&gt; //整型环境 #include &lt;tgmath.h&gt; //通用类型数学宏

    C++STL程序员开发指南【可搜索+可编辑】

    1-1-10 数组和指针技术的不同......................................... 14 1-2 C++存储技术........................................................ 15 1-2 一I C++存储类型.....................................

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

    C++ primer 第4版 原书+习题解答+源码 清晰pdf,非影印。 本书是久负盛名的C++经典教程引,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,...

Global site tag (gtag.js) - Google Analytics