泛型算法

	泛型算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上。使用泛型算法必须包含头文件<algorithm>。
一、读容器元素的算法
1.find运算
	假设有一个int型的vector对象,名为vec,我们想知道其中是否包含某个特定值。解决这个问题最简单的方法是使用标准库提供的find运算。
	int search_value = 42;
	vector<int>::const_iterator result = find(vec.begin(), vec.end(), search_value);
	只要找到与给定值相等的元素,find就会返回指向该元素的迭代器,如果没有匹配的元素,find就会返回它的第二个迭代器实参,表示查找失败。标准库还定义了一组泛化的算术算法,必须包含头文件<numeric>。
2.只读算法accumulate
	int sum = accumulate(vec.begin(), vec.end(), 42);
	将sum设置为vec的元素之和再加上42.
3.find_first_of的使用
	这个算法带有两对迭代器参数来标记两段元素范围,在第一段范围内查找与第二段范围中任意元素匹配的元素,然后返回一个迭代器,指向第一个匹配的元素。如果找不到匹配元素,则返回第一个范围的end迭代器。这两对迭代器不要求类型匹配。
	size_t cnt = 0;
	list<string>::iterator it = roster1.begin();
	while ((it = find_first_of(it, roster1.end(), roster2.begin(), roster2.end())) != roster1.end())
	{
		++cnt;
		++it;
	}
	cout << "Found" << cnt << "names on both rosters" << endl;
二、写容器元素的算法
1.写入输入序列的元素
	写入到输入序列的算法本质上是安全的--只会写入与指定输入范围数量相同的元素。
	fill(vec.begin(), vec.end(), 0);
	fill(vec.begin(), vec.begin() + vec.size()/2, 10);
	fill带有一对迭代器形参,用于指定要写入的范围,而所写的值是它的第三个形参的副本。
2.不检查写入操作的算法
	fill_n函数带有的参数包括:一个迭代器、一个计数器以及一个值。初学者常犯的错误是:在没有元素的空容器上调用fill_n函数。例:
	vector<int> vec;
	fill_n(vec.begin(), 10, 0);
	这个fill_n函数将带来灾难性的后果,我们指定要写入10个元素,但这些元素却不存在--vec是空的。其结果未定义,很可能导致严重的运行时的错误。
3.引入back_inserter
	确保算法有足够的元素存储输出数据的一种方法是使用插入迭代器。插入迭代器是可以给基础容器添加元素的迭代器。而使用插入迭代器赋值时,则会在容器中添加一个新元素,其值等于赋值运算的右操作数的值。
	vector<int> vec;
	fill_n(back_inserter(vec), 10, 0);
	现在,fill_n函数每写入一个值,都会通过back_inserter生成的插入迭代器实现。
4.写入到目标迭代器的算法
	向目标迭代器写入未知个数的元素。copy带有三个迭代器参数:头两个指定输入范围,第三个则指向目标序列的一个元素。传递给copy的目标序列必须至少要与输入范围一样大。
	vector<int> ivec;
	copy(ilst.begin(), ilst.end(), back_inserter(ivec));
	copy从输入范围中读取元素,然后将他们复制给目标ivec.
三、对容器元素重新排序的算法
1.按字典次序排序的sort
	假设我们的输入存储在一个名为words的vector对象中;则:
	sort(words.begin(), words.end());
2."删除"重复的单词的unique
	vector<string>::iterator end_unique = unique(words.begin(), words.end());
	unique实际上并没有删除任何元素,而是将无重复的元素复制到序列的前端,从而覆盖相邻的重复元素。unique返回的迭代器指向超出无重复的元素范围末端的下一位置。
3.另外两个泛型算法:stable_sort和count_if,使用这些算法,还需要一个配套的实用函数,称为谓词。谓词是做某些检测的函数,返回用于条件判断的类型,指出条件是否成立。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值