CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  工具平台和程序库

VC7的vector比起VC6的变化,让我感觉很不爽,各位有什么好办法没有?

楼主oyd() oyd() oyd() oyd() oyd()2006-04-29 19:07:24 在 C/C++ / 工具平台和程序库 提问

在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

相关问题

关键词

得分解答快速导航

  • 帖主:oyd
  • sharpdew

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo