参考:
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之类的操作之后,就需要重新取得第一个元素的地址。因为之前取得的地址可能已经无效了。
相关推荐
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函数 ...
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++代码--vs2008从指针到多线程、文件读写、套接字 ...C++_07_2模板vector 网络通信_test MFC_线程_test socket 服务端和客户端--网上的例子1 类、多线程、套接字(服务端) 类、多线程、套接字(客户端)
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 模板...
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++/CX 程序中自由使用常规 C 样式数组或 std::array(尽管 std::vector 通常是更好的选择),但是,在元数据内发布的任何 API 中,必须将 C 样式数组或向量转换为 Platform::Array 或 Platform::...
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初级教程,课程内容是学习C++语言基础知识,对应着教材的第1章到第8章。 第1章 快速入门 1.1 编写简单的C++程序 1.2 初窥输入/输出 1.2.1 标准输入与输出对象 1.2.2 一个使用IO库的程序 ...
#include <vector> //STL 动态数组容器 #include #include using namespace std; ////////////////////////////////////////////////////////////////////////// C99 增加 #include <complex.h> //复数处理 ...
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 ...
运用到了STL中的vector,实现动态数组。
3.17 C++转换机制(static_cast、dynamic_cast、reinpreter_cast、 const_cast) 3.18 深拷贝和浅拷贝 3.18 动态绑定和静态绑定 3.19 实现不能在堆、栈分配的类,不能被继承的类 3.20 堆和栈 3.20.1 程序内存分配 ...
c主函数调用C++类,包含中间转换层,下载即可用。C++类为vector数组,可指定数插入和随机数插入,并进行排序,均转换成c可调用。
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...
第7章参数传递-vector和其他容器类型的形参 60.第7章参数传递-数组形参 61.第7章main处理命令行选项 62.第7章return语句 63.第7章递归 64.第7章函数声明 65.第7章局部对象 66.第7章内联函数 67.第7...
本人收集: C/C++头文件一览 C、传统 C++ #include <... //整数格式转换 #include <stdbool.h> //布尔环境 #include <stdint.h> //整型环境 #include <tgmath.h> //通用类型数学宏
1-1-10 数组和指针技术的不同......................................... 14 1-2 C++存储技术........................................................ 15 1-2 一I C++存储类型.....................................
C++ primer 第4版 原书+习题解答+源码 清晰pdf,非影印。 本书是久负盛名的C++经典教程引,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,...