C++vector对象转数组
来源:互联网 发布:mac版draw9patch下载 编辑:程序博客网 时间:2024/05/21 03:24
转自http://www.blogbus.com/yzyanchao-logs/47796444.html,作者:yzyanchao
参考: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++中这么做的话,就会引发一个编译错误)
- C++vector对象转数组
- php 对象转数组
- php对象转数组
- js 对象转数组
- Laravel 对象转数组
- js 对象转数组
- php 对象转数组
- php 将对象转数组
- php 对象转数组 objectToArray
- object jsonArray 对象转数组
- c++vector对象初始化
- c++ stl vector转数组(实际是数组的指针)
- PHP 对象转数组 Object转array
- PHP 对象转数组 Object转array
- json字符串转数组转对象
- 记录下 XML对象转数组
- json字符串转数组、对象(json_decode)
- array.slice.call 对象转数组
- Hyper-V初涉_虚拟磁盘链错误的修复
- 致那些徘徊在测试界的屌丝
- 如何查看数据库中某用户,正在运行什么SQL 语句
- 监狱-劳教所-看守所区别自结
- shell脚本及makefile中的特殊变量
- C++vector对象转数组
- leetcode Single Number II
- Js获取当前日期时间及其它操作
- Eclipse中连接MySQL数据库
- nginx rewrite 参数和例子
- 利用IPC通道进行进程间通信(C#)
- android SDK更新缓慢问题
- 大小之差
- 查看表空间使用情况