善用STL中的find方法,慎用vector的erase
2013-07-17 22:02
393 查看
用C++的stl库,相信大家都有用vector的经历,毕竟vector支持直接下标方式取数据的确方便很多。
但是vector默认是不提供find方法的,所以我们在查找的时候,通常这样写代码:
vector<int> vec;
for(unsigned int i = 0;i<vec.size();++i)
{
if(vec[i]==xxx)
{
break;
}
}
并不是说提供不了,而是stl库中实际上已经有通用的find函数(不止find……)
可以看一下下面的代码:
int main(int argc,char* argv[])
{
vector<int> vec;
vec.push_back(123);
vec.push_back(456);
vector<int>::iterator findit = find(vec.begin(),vec.end(),123);
//vector<int>::iterator findit = find(vec.begin(),vec.end(),111);
if(findit==vec.end())
{
printf("no find\n");
}
else
{
printf("find[%d]\n",*findit);
}
return 0;
}
这样的写法会不会简单很多呢?
需要说明的是,虽然这个通用的find方法也是可以用在map,set等上面的,但是效率会比容器内部的find方法慢很多,所以,除非容器实在是没有提供find方法,否则还是建议不要用公共的这一种。
另外,作为题外话,我们需要注意一下vector的删除(erase)操作。由于vector需要能以下标方式取数据,所以必须时刻保证连续的存储空间,对应于实现上,即,当删除vector中间的一个成员时,这个成员后面的所有成员,会以原顺序向前全部拷贝过来。有兴趣的朋友,可以用这个例子测试一下。
这里起码告诉了我们两件事:
1.vector中一个成员被删除,会导致后面的成员进行copy和析构操作。
2.vector不适合做有大量插入删除操作的容器,因为拷贝内存本身浪费很大
OK,到此为止啦~
但是vector默认是不提供find方法的,所以我们在查找的时候,通常这样写代码:
vector<int> vec;
for(unsigned int i = 0;i<vec.size();++i)
{
if(vec[i]==xxx)
{
break;
}
}
并不是说提供不了,而是stl库中实际上已经有通用的find函数(不止find……)
可以看一下下面的代码:
int main(int argc,char* argv[])
{
vector<int> vec;
vec.push_back(123);
vec.push_back(456);
vector<int>::iterator findit = find(vec.begin(),vec.end(),123);
//vector<int>::iterator findit = find(vec.begin(),vec.end(),111);
if(findit==vec.end())
{
printf("no find\n");
}
else
{
printf("find[%d]\n",*findit);
}
return 0;
}
这样的写法会不会简单很多呢?
需要说明的是,虽然这个通用的find方法也是可以用在map,set等上面的,但是效率会比容器内部的find方法慢很多,所以,除非容器实在是没有提供find方法,否则还是建议不要用公共的这一种。
另外,作为题外话,我们需要注意一下vector的删除(erase)操作。由于vector需要能以下标方式取数据,所以必须时刻保证连续的存储空间,对应于实现上,即,当删除vector中间的一个成员时,这个成员后面的所有成员,会以原顺序向前全部拷贝过来。有兴趣的朋友,可以用这个例子测试一下。
这里起码告诉了我们两件事:
1.vector中一个成员被删除,会导致后面的成员进行copy和析构操作。
2.vector不适合做有大量插入删除操作的容器,因为拷贝内存本身浪费很大
OK,到此为止啦~
相关文章推荐
- stl中vector删除方法erase的原理
- STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
- C++/STL_中vector基本操作测试代码,vector.erase()使用方法
- STL中用erase()方法遍历删除元素
- C++的STL中vector内存分配方法的简单探索
- 实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法
- vector::erase()方法的详细介绍及问题解答
- STL vector erase 笔试 曼恒数字
- STL可能的误用-find_first_of和erase
- 【STL中的erase()方法 】
- STL中用erase()方法遍历删除元素
- STL中用ERASE()方法遍历删除元素
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- STL中用erase()方法遍历删除元素
- STL中用erase()方法遍历删除元素
- stl.list正确erase方法
- STL中用ERASE()方法遍历删除元素
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- leetcode-27. Remove Element--STL Vector remove()和erase()的使用