C++ primer plus 第16章string 类和标准模板库, 算法的通用特征

C++ primer plus 第16章string 类和标准模板库, 算法的通用特征

C++ primer plus 第16章string 类和标准模板库, 算法的通用特征


16.6.2 算法的通用特征

正如您多次看到的,STL函数使用迭代器和迭代器区间。从函数原型可知有关迭代器的假设。例如,copy()函数的原型如下:

template<class InputIterator,class utputIterator>
OutputIterator copy(InputIterator first,InputIterator last,
OutputIterator result);

因为标识符 Inputlterator 和 Outputlterator 都是模板参数,所以它们就像T和U一样。然而,STL 文档使用模板参数名称来表示参数模型的概念。因此上述声明告诉我们,区间参数必须是输入迭代器或更高级别的迭代器,而指示结果存储位置的选代器必须是输出选代器或更高级别的选代器。
对算法进行分类的方式之一是按结果放置的位置进行分类。有些算法就地完成工作,有些则创建拷贝。例如,在 sort()函数完成时,结果被存放在原始数据的位置上,因此,sort()是就地算法(in-place algorithm);而 copy()函数将结果发送到另一个位置,所以它是复制算法(copying algorithm)。transform()函数可以以这两种方式完成工作。与copy()相似,它使用输出迭代器指示结果的存储位置:与copy()不同的是,transform()允许输出迭代器指向输入区间,因此它可以用计算结果覆盖原来的值。
有些算法有两个版本:就地版本和复制版本。STL的约定是,复制版本的名称将以copy结尾。复制版本将接受一个额外的输出迭代器参数,该参数指定结果的放置位置。例如,函数replace()的原型如下:

template<class ForwardIterator,classT>
	void replace(ForwardIterator first,ForwardIterator last,
	const T& old value,const T& new value);

它将所有的 old value 替换为new value,这是就地发生的。由于这种算法同时读写容器元素,因此迭代器类型必须是ForwardIterator 或更高级别的。复制版本的原型如下:

template<class InputIterator,class OutputIterator, class T>
OutputIterator replace copy(InputIterator first, 
	InputIterator last,OutputIterator result,
	const T& old value,const T& new value);

在这里,结果被复制到result 指定的新位置,因此对于指定区间而言,只读输入迭代器足够了注意,replace copy()的返回类型为 Outputlterator。对于复制算法,统一的约定是:返回一个迭代器
该迭代器指向复制的最后一个值后面的一个位置。另一个常见的变体是:有些函数有这样的版本,即根据将函数应用于容器元素得到的结果来执行操作。这些版本的名称通常以 f结尾。例如,如果将函数用于旧值时,返回的值为true,则replace if()将把旧值替换为新的值。下面是该函数的原型:

template<class ForwardIterator,class Predicate class T>
void replace_if(ForwardIterator first,ForwardIterator last,
	Predicate pred,const T& new value);

如前所述,谓词是返回 bool值的一元函数。还有一个replace_copy_if()版本,您不难知道其作用和原型。
与 Imnputlterator 一样,Predicate 也是模板参数名称,可以为T或U。然而,STL选择用 Predicate 来提醒用户,实参应模拟 Predicate 概念。同样,STL使用诸如 Generator和 BinaryPredicate 等术语来指示必须模拟其他函数对象概念的参数。请记住,虽然文档可指出迭代器或函数符需求,但编译器不会对此进行检查。如果您使用了错误的迭代器,则编译器试图实例化模板时,将显示大量的错误消息。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值