Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225117
  • 博文数量: 36
  • 博客积分: 482
  • 博客等级: 下士
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 12:14
个人简介

Hi-ho, Silver! 在一个商业英雄辈出的年代,让我们用技术做一次华丽的冒险。向Linus致敬,向Stallman致敬!

文章分类

全部博文(36)

文章存档

2013年(24)

2012年(1)

2011年(8)

2010年(3)

我的朋友

分类: C/C++

2013-03-09 21:40:59

善用STL中的find方法,慎用vector的erase

用C++的stl库,相信大家都有用vector的经历,毕竟vector支持直接下标方式取数据的确方便很多。
但是vector默认是不提供find方法的,所以我们在查找的时候,通常这样写代码:

点击(此处)折叠或打开

  1. vector<int> vec;
  2. for(unsigned int i = 0;i<vec.size();++i)
  3. {
  4.     if(vec[i]==xxx)
  5.     {
  6.         break;
  7.     }
  8. }

并不是说提供不了,而是stl库中实际上已经有通用的find函数(不止find……)
可以看一下下面的代码:

点击(此处)折叠或打开

  1. int main(int argc,char* argv[])
  2. {
  3.     vector<int> vec;
  4.     vec.push_back(123);
  5.     vec.push_back(456);
  6.     vector<int>::iterator findit = find(vec.begin(),vec.end(),123);
  7.     //vector<int>::iterator findit = find(vec.begin(),vec.end(),111);
  8.     if(findit==vec.end())
  9.     {
  10.         printf("no findn");
  11.     }
  12.     else
  13.     {
  14.         printf("find[%d]n",*findit);
  15.     }
  16.     return 0;
  17. }

这样的写法会不会简单很多呢?
需要说明的是,虽然这个通用的find方法也是可以用在map,set等上面的,但是效率会比容器内部的find方法慢很多,所以,除非容器实在是没有提供find方法,否则还是建议不要用公共的这一种。
另外,作为题外话,我们需要注意一下vector的删除(erase)操作。由于vector需要能以下标方式取数据,所以必须时刻保证连续的存储空间,对应于实现上,即,当删除vector中间的一个成员时,这个成员后面的所有成员,会以原顺序向前全部拷贝过来。有兴趣的朋友,可以用这个例子测试一下。
这里起码告诉了我们两件事:
1.vector中一个成员被删除,会导致后面的成员进行copy和析构操作。
2.vector不适合做有大量插入删除操作的容器,因为拷贝内存本身浪费很大

转自 :

阅读(1407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~