鹰潭月湖区身份证:polyline中使用vector
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 05:42:59
实际编程中经常出现这样的情况:
比如说要使用画曲线的windows函数
BOOL Polyline(
HDC hdc, // handle to device context
CONST POINT *lppt, // pointer to array containing endpoints
int cPoints // number of points in the array
);
显然这个函数要传一个数组进去,我们可以从文件中读取点集到vector 中,那么现在就需要把vector转换为数组,一种方法当然是把vector拷贝到数组中,这个方法显然占用双倍的内存,可以舍弃。还有一种方法,如下:(PointList是vector 类型的)
const POINT *lpData=static_cast (PointList.begin());
这种方法可行否,在vc下是运行是没有问题的,但是显然这样比较怪
那么这种方法可行否,理论上如何讲?因为显然是将一个迭代器转型了。如果不行,有没有更好的方法?我想stl的设计人一定考虑过这些问题,因为这些应用是很普遍的
给定一个
vector 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++中这么做的话,就会引发一个编译错误)
比如说要使用画曲线的windows函数
BOOL Polyline(
HDC hdc, // handle to device context
CONST POINT *lppt, // pointer to array containing endpoints
int cPoints // number of points in the array
);
显然这个函数要传一个数组进去,我们可以从文件中读取点集到vector
const POINT *lpData=static_cast
这种方法可行否,在vc下是运行是没有问题的,但是显然这样比较怪
那么这种方法可行否,理论上如何讲?因为显然是将一个迭代器转型了。如果不行,有没有更好的方法?我想stl的设计人一定考虑过这些问题,因为这些应用是很普遍的
给定一个
vector
表达式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++中这么做的话,就会引发一个编译错误)
polyline中使用vector
Vector 变量的使用
Java中Vector的用法
vector详解
STL vector用法
Vector向量知识
STL vector 容器介绍
vector用法总结
iBATIS中使用EHCache
会议中音乐使用
在struts2中使用JFreeChart2
在eclipse中使用jena
书法作品中印章的使用
VC++中使用_RecordSetPtr总结
在DLL中使用资源
Android 中LayoutInflater的使用!
excel中单元格的使用
在sed中使用变量
通达信软件使用中几个小窍门
Struts2中使用FreeMarker充当表现层
使用电脑中比较实用的技巧
使用电磁流量计中常见故障的处理
书法作品中印章的使用与欣赏
如何在使用中规避“X”交