您的位置:首页 > 其它

适配器、泛型算法

2013-09-28 19:01 281 查看
容器适配器:在基本容器的基础上通过改变它们的接口来实现特殊的容器,这就是容器适配器。

适配器:利用一种已有的比较通用的数据结构(通过组合而非继承)来实现更加具体的、更加贴近实际应用的数据结构。

标准C++算法:其通用性事通过模板、迭代器、元素符重载及函数对象来实现。作为算法,不必关心所操作的数据对象在容器中的位置,也不必知道容器的类型甚至数据对象的类型,所要做的工作就是“改变迭代器,并按照用户指定的方式,逐个地对迭代器指向的对象进行定制的操作”。

STL提供的泛型算法主要有以下几种:

& 查找算法,如find()、search()、binary_search、find_if()等;

& 排序算法,如sort()、merge()等;

& 数学计算,如accumulate()、inner_product()、partial_sum()等;

& 集合运算,如set_union()、set_intersection()、includes()等;

& 容器管理,如copy()、replace()、transform()、remove()、for_each()等;

& 统计运算,如max()、min()、count()、max_element()等;

& 堆管理,如make_heap()、push_heap()、pop_heap()、sort_heap();

& 比较运算,如equal()等。

泛型算法都是定义于名字空间std::内的函数模板。

泛型算法的参数类型有下列几种:

@ 迭代器,标示容器或区间的范围,以值传递;

@ 谓词,返回bool值的函数对象,指定算法的操作方式,例如find_if()的第三个参数;

@ 函数对象,用户指定要做的操作,例如for_each()的第三个参数;

@ 容器元素,用户指定的基准对象,例如find()的第三个参数。

提示:泛型算法不接受容器对象作为参数,因此它不了解与传入的迭代器关联容器的具体情况,当然它也不能对容器做任何操作(即无法调用容器的方法),除非使用迭代器适配器。因此,必须保证传入的每一对迭代器是有效的,从first可以到达last。

提示:给算法传递迭代器对象时,没有必要使用引用传递,因为迭代器就是指针或是模拟指针,本身开销小。

提示:在使用带有输出迭代器参数的泛型算法时,一定要给输出容器(目标容器)分配足够的空闲空间,否则操作结果不可预料。

提示:很多泛型算法总是假定容器的元素类型定义了operator=()、operator=()、operator!=()、operator<()或operator>()等函数,因此你有义务为你的容器类型定义它们,否则泛型算法将采用元素类型的默认语义或者报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: