1、mean(a, 5);std:endl; return 0;/使用了STL的代码 vectorint main() vector a; a.push_back(1); a.push_back(2); a.push_back(3); a.push_back(4); a.push_back(5); for(int i = 0; i a.size(); +i) std:ai 1.2 模板(template) 针对一个或多个尚未明确的类型所撰写的函数或类。1.2.1函数模板 #includeusing namespace std;/定义函数模板 templateT MAX(T a, T b) retu
2、rn (ab)?a:b;int main() int x=2,y=6; double x1=9.123,y1=12.6543; coutmax(x,y)max(x1,y1)1.2.2类模板/类模板/定义名为ex_class的类模板template class ex_class T value;public: ex_class(T v) value = v; void set_value(T,v) T get_value(void) return value; /测试char类型数据 ex_class ch(A);ch.value:ch.get_value() ch.set_value(aeng
3、l; /测试double类型的数据 d(5.5);d.value:d.get_value() x.set_value(7.4);x.value:x.get_value()1.3 STL组件(1)容器(Container) - 管理某类对象的集合 (2)迭代器(Iterator) - 在对象集合上进行遍历 (3)算法(Algorithm) - 处理集合内的元素 (4)容器适配器(container adaptor) (5)函数对象(functor) 1.4 STL容器类别 (1)序列式容器-排列次序取决于插入时机和位置 。(2)关联式容器-排列顺序取决于特定准则。1.5 STL容器的共通能力(1
4、)所有容器中存放的都是值而非引用,即容器进行安插操作时内部实施的是拷贝操作。因此容器的每个元素必须能够被拷贝。如果希望存放的不是副本,容器元素只能是指针。(2)所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素。(3)各项操作并非绝对安全,调用者必须确保传给操作函数的参数符合需求,否则会导致未定义的行为。1.6 STL容器元素的条件(1)必须能够通过拷贝构造函数进行复制。(2)必须可以通过赋值运算符完成赋值操作。(3)必须可以通过析构函数完称销毁动作。(4)序列式容器元素的默认构造函数必须可用。(5)某些动作必须定义operator =,例如搜寻操作。(6)关联式容器
5、必须定义出排序准则,默认情况是重载。operator 对于基本数据类型(int,long,char,double,)而言,以上条件总是满足1.7 STL容器的共通操作 (1)初始化(initialization) 产生一个空容器list l;以另一个容器元素为初值完成初始化。 float c(l.begin(),l.end();以数组元素为初值完成初始化。 int array=2,4,6,1345;setc(array,array+sizeof(array)/sizeof(array0);(2)与大小相关的操作(size operator) size()-返回当前容器的元素数量。empty()
6、-判断容器是否为空。max_size()-返回容器能容纳的最大元素数量。(3)比较(comparison) =,!=,= 1)比较操作两端的容器必须属于同一类型。2)如果两个容器内的所有元素按序相等,那么这两个容器相等。3)采用字典式顺序判断某个容器是否小于另一个容器。(4)赋值(assignment)和交换(swap) swap用于提高赋值操作效率。(5)与迭代器(iterator)相关的操作 begin()-返回一个迭代器,指向第一个元素。end()-返回一个迭代器,指向最后一个元素之后。rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素。rend()-返回一个逆向迭代器,指向
7、逆向遍历的最后一个元素之后。(6)元素操作 insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置。erase(beg,end)-移除beg,end区间内的所有元素。clear()-移除所有元素。1.8 迭代器(iterator) 1.8.1 迭代器的特点(示例:iterator) (1)可遍历STL容器内全部或部分元素的对象。(2)指出容器中的一个特定位置。(3)迭代器的基本操作:(4)所有容器都提供获得迭代器的函数半开区间beg, end)的好处:1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end(),循环就可以继续)。2.不必对空区间采取特殊处理(空区间
8、的begin()就等于end()(5)所有容器都提供两种迭代器 container:iterator 以“读/写”模式遍历元素 。const_iterator 以“只读”模式遍历元素。(6)迭代器示例:iterator 1.8.2 迭代器分类 (1)双向迭代器l;for(pos=l.begin();pos!=l.end();+pos 1)可以双向行进,以递增运算前进或以递减运算后退、可以用=和!=比较。2)list、set和map提供双向迭代器。(2)随机存取迭代器1)除了具备双向迭代器的所有属性,还具备随机访问能力。2)可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用之类的关系
9、运算符比较两个迭代器。3)vector、deque和string提供随机存取迭代器vector v;for(pos=v.begin();posv.end();+pos 2. STL容器2.1 vector容器2.1.1 vector容器的特点(1)vector模拟动态数组。(2)vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)。(3)必须包含的头文件#includev;v.assign(l.begin(),l.end();2.1.5 vector 元素存取 /empty v5= t; /runtime error cout (4)l
10、ist不支持随机存取,因此不提供下标操作符。(5)在任何位置上执行元素的安插和移除都非常快。(6)安插和删除不会导致指向其他元素的指针、引用、iterator 失效。2.2.2 list 构造、拷贝和析构 2.2.3 非变动性操作2.2.4 list 赋值2.2.5 list 元素存取 l.front();if(!l.empty() l.back(); /ok2.2.6 list 迭代器相关函数2.2.7 list 安插(insert)元素2.2.8 list 移除(remove)元素2.2.9 list 特殊变动性操作2.2.10 list应用实例2.3 map容器2.3.1 map/mul
11、timap特点(1)使用平衡二叉树管理元素。(2)元素包含两部分(key,value),key和value可以是任意类型。(3)必须包含的头文件#include (4)根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢。(5)不能直接改变元素的key,可以通过operator 直接存取元素值。(6)map中不允许key相同的元素,multimap允key相同的元素。(7)map/multimap 内部存储结构图:2.3.2 map/multimap 构造、拷贝和析构其中map可以是下列形式 :map 一个以less( 一个以op为排序准则的map。
12、2.3.3 map/multimap 非变动性操作2.3.4 map/multimap 赋值2.3.5 map/multimap 特殊搜寻操作2.3.6 map/multimap 迭代器相关函数2.3.7 map/multimap 安插(insert)元素2.3.8 map/multimap 移除(remove)元素2.3.9 map/multimap map应用实例map3. STL算法(1)STL提供了一些标准算法来处理容器内的元素。搜寻、排序、拷贝、数值运算。(2)STL的算法是全局函数 a.明确划分数据和操作。b.泛型函数式编程模式。c.所有算法可以对所有容器适用,甚至可以操作不同类型
13、容器的元素 (3)算法头文件 #include(4)STL算法实例:algorithm3.1 区间(range) (1)所有算法都用来处理一个或多个区间内的元素。(2)区间可以但不一定涵盖容器内所有元素。(3)为了操作元素的某个子集必须将区间的首尾(iterator)当作两个参数传递给算法。(4)调用时必须确保区间有效性。a.从起点出发,逐一前进,能够到达终点。b.区间首尾两个迭代器必须属于同一容器,且前后放置正确。c.无效区间可能会引起无限循环或者内存非法访问(5)所有算法处理的都是半开区间begin, end)。3.2 STL算法分类 (1)非变动性算法(nonmodifying algo
14、rithms) (2)变动性算法(modifying algorithms) (3)移除性算法(removing algorithms) (4)变序性算法(mutating algorithms) (5)排序性算法(sorting algorithms) (6)已序区间算法(sorted range algorithms) (7)数值算法(numeric algorithms)3.3 for_each()算法 for_each(InputIterator beg, InputIterator end, UnaryProc op) 对区间beg, end)中的每一个元素调用。op(elem) 返回op之后的容器副本。op可以改变元素。op的返回值被忽略。复杂度:O(n) 示例:foreach3.4 非变动性算法 既不改变元素次序也不改变元素值 3.4.1元素计数 (1)count(InputIterator beg,InputIterator end, const T& value) 计算区间中值等于value的元素个数。(2)count(InputIterator beg,InputIterator end, Predicate op) 计算区间中使判断式op结果为true的元素个。op接受单个参数,返回值为bool型。3.4.2排序算法需要动用随机存取迭代器。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1