VC7的vector比起VC6的变化,让我感觉很不爽,各位有什么好办法没有?
在VC6中,我可以用这样的方法来简化数组操作和实现异常安全
void SomeOp(BYTE* pBuf, int nLen);
void Foo ()
{
//...
vector<BYTE> buf(reqsize);
SomeOp(buf.begin(), buf.size());
}
因为在VC6的stl中vector<T>::iterator的类型正是T*,
可是到了VC7,同样功能的代码我要写成令人恶心的
SomeOp(&(*buf.begin()), buf.size());
不知道各位还有什么好的用法没有,要没有的话,我等下去找vc7的STL作者开骂去。
问题点数:20、回复次数:18Top
1 楼sharpdew(风刃)回复于 2006-04-29 21:50:29 得分 20
骂得好,不过也可以这样:
SomeOp(&buf[0], buf.size());Top
2 楼sharpdew(风刃)回复于 2006-04-29 21:53:28 得分 0
VS下得vector在内部定义了一个const_iterator和一个iterator类,所以需要你那样处理,
而gcc下是直接typedef T* iterator。Top
3 楼sharpdew(风刃)回复于 2006-04-29 21:57:27 得分 0
平衡二叉树呀,插入新节点后为了保持整棵树得平衡,需要旋转树枝,所有旋转细节和任何一本数据结构书上讲得一样,你应该先看懂理论才行。Top
4 楼bluebay(bluebay)回复于 2006-04-29 22:16:12 得分 0
楼上的,发错题目了吧Top
5 楼sharpdew(风刃)回复于 2006-04-29 22:17:34 得分 0
哦,不好意思,那个平衡二叉树是要发到另外一个问题的,嘻嘻
怎么不提供一个让我可以删除自己回复的功能呢?Top
6 楼cattlenzq(吃狼的豆腐(不要给分了,散起来真麻烦!))回复于 2006-04-29 23:19:55 得分 0
我一直用的是
SomeOp(&buf[0], buf.size());
这样也可以
SomeOp(&buf.front(), buf.size());
Top
7 楼fangrk(加把油,伙计!)回复于 2006-04-30 22:21:21 得分 0
vector<T>的iterator不一定是T*,如果你要使用T*,那么可以使用&buf[0]
可以阅读《Effective STL》Top
8 楼iambic()回复于 2006-04-30 23:38:02 得分 0
晕。Top
9 楼mjm_d(菠萝蜜多)回复于 2006-05-01 16:09:47 得分 0
只能说明 楼主 没有良好的编程习惯
这是大忌
为了通用和可扩展 通常不要使用小聪明 小聪明可以用在和朋友吹牛和考试的时候
Top
10 楼Linux2001(闭关开发中)回复于 2006-05-05 15:37:39 得分 0
VC6的STL不是很好,你可以去使用STLport,我一直使用这个,begin()返回的是一个const的iterator也就是const_iterator,这样无论是传递参数时的性能还是安全性来讲都是好的Top
11 楼rickerliang(专回0分贴(来交流不是为分))回复于 2006-05-08 13:06:45 得分 0
void SomeOp(BYTE* pBuf, int nLen);
这个东西应该改成
void SomeOp(vector<BYTE>::iterator iter, vector<BYTE>::size_type nLen);
既然你用stl了,就应符合标准Top
12 楼delphihero(何去何从)回复于 2006-05-08 13:30:46 得分 0
请看effective stl 16:
如何将vector和string的数据传给遗留的API
使用 &v[0] ,这是里面一段话:
begin()的返回类型是iterator,而不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin()。如果你基于某些原因决定键入v.begin(),就键入&*v.begin(),因为这将会产生和&v[0]相同的指针,虽然它让你有更多的击键工作且让代码读起来更晦涩。坦白地说,如果你正被告诉你使用v.begin()代替&v[0]的人围绕的话,你该重新考虑一下你的社交圈了。
Top
13 楼oyd() oyd() oyd() oyd() oyd()回复于 2006-06-21 15:03:34 得分 0
我不同意rickerliang() 的说法
在某些层次上,为了通用,我还必须用BYTE*作为接口,例如DLL导出函数
另外,就算是内部用,也绝对不会是
void SomeOp(vector<BYTE>::iterator iter, vector<BYTE>::size_type nLen);
相反,我会用void SomeOp(const vector<BYTE> &v);
或者考虑用模板函数template <class T> void SomeOp(T _F, T _L);
to
delphihero(何去何从)
effective stl 我没看过,你说的那一章你也没有表述完全,但是我不迷信一本书。
我认为就你引用的这段话来说,是值得商榷的。首先,vector<T>::iterator的实际类型并非一定不能是T*。
另外从其内存布局来看,&v[0]如果可以代替T*,那么iterator没有理由不可以隐式转化为T*。
我不知道新的STL的实现为什么不提供这样的特性,但是我知道现在的做法完全破坏了程序的美感,在我键入&v[0]的时候,我觉得思维一下子就被打断了。
Top
14 楼cxjddd(又是花开时)回复于 2006-06-21 18:24:19 得分 0
既然使用了 STL,就应该把 SomeOp 改了。。。
template <typename Iter>
void SomeOp (Iter first, Iter last);
^_^Top
15 楼yeyuboy(海绵)回复于 2006-06-21 20:03:31 得分 0
一直是参考《Effective STL》使用vector:&vec[0]Top
16 楼wingfiring(非典型秃子)回复于 2006-06-27 15:05:05 得分 0
iterator更重要的任务是维护自身的concept,这样才能够更好地被新手和熟手理解.带着自己的偏见来要求iterator应该遵循自己的习惯是不妥当的.首先,作为一个曾经的C程序员,我不觉得&v[0]有什么丑陋,其次,如果你真的特别在意美感,你可以修改SomeOp的接口。即使你无法修改SomeOp的接口,你也完全可以通过一个间接层来实现:
SomeOpWraper(iterator itr, size_t size)
{
SomeOpWraper(&(*itr), size);
}
确实,我们不应该迷信一本书,但是你在否定之前,务必试图理解书中建议的缘由。Top
17 楼oyd() oyd() oyd() oyd() oyd()回复于 2006-06-29 13:38:00 得分 0
我当然可以把SomeOp增加一个间接层。如果我有闲功夫,我可以把所有的代码中有char*参数的都增加一个Wraper。
可是,你们谁能告诉我为vector<T>的iterator增加一个operator T*的坏处在哪吗?Top
18 楼jadedrip(翡翠水滴)回复于 2006-06-29 14:22:41 得分 0
iterator 不是一个指针,标准就是这么定义的。
vc6 的 stl 不符合标准Top




