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

    技术2022-05-19  43

    用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,到此为止啦~

     


    最新回复(0)