2018.10.16——第十章-10.1概述-10.2初识泛型算法

本文深入探讨了C++标准模板库(STL)中的关键算法,包括count和accumulate函数的使用,以及它们在处理不同数据类型时的行为。通过具体示例,如在vector和list容器中搜索特定值和计算总和,展示了这些算法的实际应用。同时,文章揭示了double类型转换为int类型的陷阱,以及如何正确使用accumulate函数来避免精度损失。此外,还解析了equal函数在比较字符串时的局限性和正确用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10.1

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	int val = 1;
	vector<int> v1 = {1, 2, 3, 1, 1, 2, 8, 7, 1, 1};
	cout << count(v1.cbegin(), v1.cend(), val) << endl;
	return 0;
}

答案

#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
	ifstream in(argv[1]);
	if (!in)
	{
		cerr << "无法打开文件" << endl;
		exit(1);
	}
	vector<int> vi;
	int val;
	while(in >> val)
		vi.push_back(val);
	cout << "输入要搜索的数:" ;
		cin >> val;
	cout << "序列中包含" << count(vi.begin(), vi.end(), val) << "个" << val;
	return 0;
}

10.2

#include <iostream>
#include <list>
#include <fstream>
#include <string>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
	ifstream in(argv[1]);
	if (!in)
	{
		cerr << "无法打开文件" << endl;
		exit(1);
	}
	list<string> sl;
	string val;
	while(in >> val)
		sl.push_back(val);
	cout << "输入要搜索的字符串:" ;
		cin >> val;
	cout << "序列中包含" << count(sl.begin(), sl.end(), val) << "个" << val;
	return 0;
}

答案同上

10.3

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

int main(int argc, char * argv[])
{
	ifstream in(argv[1]);
	if (!in)
	{
		cerr << "无法打开文件" << endl;
		exit(1);
	}
	int val;
	vector<int> vi;
	while(in >> val)
		vi.push_back(val);
	cout << "和为:" << accumulate(vi.cbegin(), vi.cend, 0) << endl;
	return 0;
}

答案同上

10.4
double类型在转换成int类型时,会舍弃小数部分,最后导致结果不正确
答案的
accumulat的第三个参数是和的初值,它决定了函数的返回类型,以及函数中使用哪个加法运算符.
因此,本题中的调用是错误的,第三个参数0告知accumulat,和是整型,使用整型加法运算符。
正确的调用方法是将0.0作为第三个参数传递给accumulat.

10.5
答案
equal使用= =运算符比较两个序列中的元素.string类重载了= =,可比较俩个字符串是否长度相等且其中元素对位相等.而C风格字符串本质是char 类型,用= =比较俩个char对象,只是检查俩个指针值是否相等,即地址是否相等,而不比较其中字符是否相等。所以,只有当俩个序列中的指针都指向相同的地址时,equal才会返回true。否则,即使内容一样,也会false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值