您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > STL 初级使用培训
初级使用培训STL中有下面几种对象:容器(containers)迭代器(iterators)算法(algorithm)函数对象(functor)空间配置器(allocator)适配器(adapter)1、容器是什么容器就是容纳各种类型数据的一个集合对象,目前stl中的容器对象只能容纳同一类型的数据。2、有哪些类型的容器(红色为顺序容器、蓝色为关联容器)vector(向量:其实就是可变长数组)deque(双端队列)-》可适配为stack(堆栈)、queue(队列)priority_queue(优先队列)list(链表:内部实现是双向链表)set(集合)multiset(多重集合)map(图:内部实现是红黑树)multimap(多重图)Vector的模型(向量)常用的接口函数:begin():返回向量第一个元素的位置游标对象(iterator)end():返回向量最后一个元素的位置游标对象(iterator)rbegin():反向返回向量第一个元素的位置游标对象(iterator)rend():反向返回向量最后一个元素的位置游标对象(iterator)push_back():将元素推入(push)到前一个元素的后面(back)resize():重新设置容器容量(放元素的个数即数组大小)clear():释放数组中的元素和释放内存empty():判断是否为空容器(没有任何元素在其中)insert():在指定位置插入元素erase():删除游标对象所在位置的元素size():获得容器内元素个数reserve():预保留容器内元素个数(可以减少内存重新分配)1、将元素放入vectorstd::vectorintvctXXX;for(inti=0;i10;i++)vctXXX.push_back(i);vctXXX.insert(vctXXX.begin()+2,13);2、取出元素//按照索引方式取元素for(size_ti=0;ivctXXX.size();i++)Tele=vctXXX[i];//通过游标方式取元素std::vectorT::Iteratoriter=vctXXX.begin();for(;iter!=vctXXX.end();iter++)Tele=*iter;3、删除元素对于容器内对象是指针的,且你想删掉容器内对象的,调用下面的代码while(!vctXXX.empty()){vctXXX.erase(vctXXX.begin());}最后调用clear方法vctXXX.clear();4、提高插入元素效率的办法比方说你大概知道这个容器内元素个数的范围,比如200-400个,你可以调用下面代码vctXXX.reserve(400);这样当容器内元素个数小于400时,容器不会重新分配内存。1:vector是容器,因此最好自己写代码来释放容器中的数据,不要期待vector析构函数来做这件事。虽然可以这样做。2:如果要频繁重新全部更换vector的数据,在处理之前一定要调用一下clear方法。3:对于反向处理vector的数据,最好使用rbegin和rend方式处理。4:对于大结构体和对象(结构体和对象中成员很多,且占用内存大),建议将其的指针放入容器,而不要把对象直接放入容器。因为当容器中元素个数超过容器容量后,容器会重新分配内存,这个时候会调用对象的拷贝构造函数、析构函数(释放),并移动内存。如果对象很大,重新构造和析构开销很大。5、stl中的vector本身没有加锁保护,多线程编程的时候对其操作需要注意加锁保护。list的模型(双向链表)常用的接口函数:begin():返回第一个元素的位置游标对象(iterator)end():返回最后一个元素的位置游标对象(iterator)rbegin():反向返回第一个元素的位置游标对象(iterator)rend():反向返回最后一个元素的位置游标对象(iterator)clear():释放内存empty():判断是否为空容器(没有任何元素在其中)insert():在当前位置插入元素erase();删除游标位置的元素remove():删除指定的元素size():获得容器内元素个数1、将元素放入liststd::listintlistXXX;for(inti=0;i10;i++)listXXX.insert(i);2、取出元素//通过游标方式取元素std::listT::Iteratoriter=listXXX.begin();for(;iter!=listXXX.end();iter++)Tele=*iter;3、删除元素while(!listXXX.empty()){listXXX.erase(listXXX.begin());}listXXX.clear();map的模型(红黑树:一种平衡二叉树)Map相当于一个字典,通过key:关键字对应到value:值。常用的接口函数:begin():返回第一个元素的位置游标对象(iterator)end():返回最后一个元素的位置游标对象(iterator)rbegin():反向返回第一个元素的位置游标对象(iterator)rend():反向返回最后一个元素的位置游标对象(iterator)clear():释放内存empty():判断是否为空容器(没有任何元素在其中)insert():在当前位置插入元素erase();删除游标位置的元素size():获得容器内元素个数find();查找元素1、将元素放入mapstd::mapint,intmapXXX;for(inti=0;i10;i++)mapXXX.insert(std::mapint,int::value_type(i,0));或者写作mapXXX[i]=0;2、取出元素(map里面是二叉树,查找是折半查找,效率极高)//通过查找取元素std::mapT1,T2::Iteratoriter=mapXXX.find(T1XXX);if(iter!=mapXXX.end())T2value=iter-second;3、删除元素while(!mapXXX.empty()){mapXXX.erase(mapXXX.begin());}mapXXX.clear();set的模型(集合:内部红黑树实现)常用的接口函数:begin():返回第一个元素的位置游标对象(iterator)end():返回最后一个元素的位置游标对象(iterator)rbegin():反向返回第一个元素的位置游标对象(iterator)rend():反向返回最后一个元素的位置游标对象(iterator)clear():释放内存empty():判断是否为空容器(没有任何元素在其中)insert():在当前位置插入元素erase();删除游标位置的元素size():获得容器内元素个数find():查找一个元素1、将元素放入setstd::setintsetXXX;for(inti=0;i10;i++)setXXX.insert(i);2、取出元素//通过游标取元素std::setT::Iteratoriter=setXXX.begin();for(;iter!=setXXX.end();iter++)Tele=*iter;3、删除元素while(!setXXX.empty()){setXXX.erase(setXXX.begin());}setXXX.clear();集合的优点是可以做集合运算:如union(并集)、subtract(差集)intersect(交集),具体用法在stl中级培训中阐述。string的模型(字符串:内部就是字节流)typedefbasic_stringchar,char_traitschar,allocatorcharstring;常用的接口函数:String中成员函数众多,这里不一一列出,可以参见msdn文档自行查找1、构造字符串std::stringstrXXX;strXXX=“helloworld”+“boy”;strXXX.assign(“helloword”);strXXX.append(strXXY.c_str();strXXX.append(strYYY);strXXX.insert(3,‘a’);strXXX=strYYY.c_str();2、获得字符串char*pstr=strXXX.c_str();pstr=strXXX.substr(0,3).c_str();3、其它compare比较字符串find、rfind、find_first_of、find_last_of、find_first_not_of、find_last_not_of查找字符串replace替换字符串erase删除字符或字符串Eos是否到了字符串结尾wstring的模型(字符串:内部就是字节流,里面是双字节的字符)typedefbasic_stringwchar_t,char_traitswchar_t,allocatorwchar_twstring;常用的接口函数:wstring中成员函数和string一致。只是里面存储的字符是双字符而已。使用方法和string也是一致的。关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。例如:templateclassT,classallocclassvector其中classT就是容器vector中的元素的类型,可以是int,double,也可以是个struct,class,或者是指针,但是不能是引用对象,如果int&,Class&等。泛型编程就像少林拳,招招都在要害上,通过不同模板参数类组合在一起,构建一个强大的模板类出来,此模板类得功能和模板参数类相关,模板参数类可能是个数据源、也可能是个内存分配器或者其它。也可以将泛型编程理解成设计模式中的组合,像搭积木一样拼成一个房子。每种、每块积木可以重用、可以任意组合构建不同形状的房子。继承方式编程就像太极拳,招招都像棉花无力(接口类),但是招式后面有无穷的绵力(实现类,对客户不可见)。
本文标题:STL 初级使用培训
链接地址:https://www.777doc.com/doc-3681857 .html