c++ primer (第10章 泛型算法) 算法

2 篇文章 0 订阅
1 篇文章 0 订阅
#include<iostream>
#include<algorithm>
#include<iterator>
#include<vector>
#include<numeric>
#include<string>
#include<list>


using namespace std;
int main()
{
	vector<int> v1 = { 1, 3, 5, 7, 9, };
	vector<string> vs = { "aaa", "bbb", "ccc", "ddd", "eee" };

//只读算法,只读取而不改变元素的算法,通常最好使用cbegin(),cend()
//find算法,接受三个参数,返回值为迭代器,前两个参数为迭代器,第三个参数为要查找的值
//查找成功返回指向第一个等于给定元素的迭代器,查找失败返回第二个参数
	int  key = 11;
	auto iter = find(v1.cbegin(), v1.cend(), key);
	cout << (iter == v1.cend() ? "search failure\n" : "search sucessful\n");

	//find用于内置数组类型
	int a[] = { 4, 2, 3, 4, 5 };
	int *pt = find(begin(a), end(a), 7);        //begin和end函数使用c++11
    //int *pt = find(a, a+5, 7);			          与上一行功能相同,注意第二个参数为查找的下一个位置,即开区间,直至但不包括a[5]
	cout << (pt == end(a) ? "search failure\n" : "search sucessful\n");

//count算法,接受三个参数,返回给定值在序列中出现的次数
	key = 7;
	int ct = count(v1.cbegin(), v1.cend(), key);  
	cout << "ct: " << ct << endl;
	ct = count(begin(a), end(a), 4);             //count同样可用于内置数组类型
	cout << "ct: " << ct << endl;

//accumulate算法,接受三个(可以四个)参数,前两个参数指定求值范围,第三个参数是和的初值,返回求和结果,算法头文件为numeric
	string s1 = "";
	string sum = accumulate(vs.cbegin(), vs.cend(), s1);
	//string sum = accumulate(vs.begin(), vs.end(), "   "); 如此无法通过编译,原因为const char* 类型上没有定义+运算符

	int sum1 = accumulate(v1.cbegin(), v1.cend(), 0);
	cout << "sum: " << sum << endl;
	cout << "sum1: " << sum1 << endl;

//操作两个序列的算法
//equal算法,接受三个迭代器做参数,前两个表示第一个序列的元素范围,第三个参数表示第二个序列的首元素
//根据判断两序列中所有元素是否相等(本质是判断第一个序列是否是第二个序列的子集)返回bool值
//equal算法可以用来比较不同类型容器和不同类型元素的值,如vector<int>={1,2,3},list<double>{1,2,3},equal返回真
//注意,对于只接受一个单一迭代器表示第二个序列的算法,都假定第二个序列长度大于等于第一个序列
	vector<int> v2 = { 1, 3, 5, };
	list<double> v3 = { 1.0, 3.0, 5.0, 7.0, 10.0 };
	bool e = equal(v2.begin(), v2.end(), v3.begin());
	cout << (e == 1 ? "equal" : "not euqal");
	cout << endl;

//写容器元素算法
//fill算法接受一对迭代器表示一个范围,第三个参数为一个值,fill将给定的这个值赋予输入序列中的每个元素
	vector<int> v4 = { 1, 3, 5, 7, 9, 11 };
	fill(v4.begin(), v4.end(), 0);           //元素全部置0
	copy(v4.cbegin(), v4.cend(), ostream_iterator<int>(cout, " "));
	cout << endl;

//fill_n算法接受一个单迭代器、一个计数值、和一个值,它将给定值赋予迭代器指向的元素开始的制定个元素
//注意,fill_n假定写入制定个元素是安全的
	vector<int> v5 = { 1, 3, 5, 7, 9, 11 };
	fill_n(v5.begin(),v5.size()/2,0);       //将v5前半部分置0
	copy(v5.cbegin(), v5.cend(), ostream_iterator<int>(cout, " ")); cout << endl;
	//fill_n(v5.begin(), 10, 0);            //第二个参数超出容器容量,将引发不可预计的后果
	//安全做法,使用插入迭代器back_inserter,以下代码完成在v5尾部插入3个0
	//使用一个普通迭代器向容器元素赋值时,值被赋予迭代器指向的元素。而通过一个插入迭代器赋值时,将把一个新元素添加至容器中
	fill_n(back_inserter(v5), 3, 0);       
	copy(v5.cbegin(), v5.cend(), ostream_iterator<int>(cout, " ")); cout << endl;

//copy算法 ,前两个参数为被拷贝对象的范围,第三个参数表示目的序列的起始位置,函数返回拷贝后目的容器的尾后位置
	int a1[] = { 1, 2, 3, 4, 5 };
	int a2[sizeof(a1) / sizeof(*a1)];  //使a2与a1等长
	copy(begin(a1), end(a1), a2);      //a1拷贝至a2
	copy(begin(a2), end(a2), ostream_iterator<int>(cout, " ")); cout << endl;

	vector<int> v6 = { 1, 3, 5, 7, 9, 11 };
	vector<int> v7 = { 1, 2, 3, 4, 5, 6, };
	copy(v6.begin(), v6.end(), v7.begin());      
	copy(v7.cbegin(), v7.cend(), ostream_iterator<int>(cout, " ")); cout << endl;

//replace算法,读入一个序列并将所有等于给定值的元素都改为另一个值
	vector<int> v8 = { 1, 2, 3, 3, 3, 4 };
	replace(v8.begin(), v8.end(), 3, 7);        //将容器中所有3改为7
	copy(v8.cbegin(), v8.cend(), ostream_iterator<int>(cout, " ")); cout << endl;

//replace_copy算法,相比replace多接受1个参数,不改变原序列的值,将替换体现在新序列上
	vector<int> v9 = { 1, 2, 3, 3, 3, 4 };
	vector<int> v10 = { 10, 20, 30, 30, 30, 40 };
	replace_copy(v8.begin(), v8.end(),v10.begin(), 3, 7);        //将v9中所有3改为7并拷贝至v10,v9本身不变
	copy(v10.cbegin(), v10.cend(), ostream_iterator<int>(cout, " ")); cout << endl;
//unique算法,接受一对迭代器范围,返回一个指向不重复值范围末尾的迭代器
	vector<int> v11 = { 1, 2, 3, 3, 3, 4 };
	auto endv11=unique(v11.begin(), v11.end());
	v11.erase(endv11, v11.end());             //将删除后空出的位置上的元素删除
	copy(v11.cbegin(), v11.cend(), ostream_iterator<int>(cout, " ")); cout << endl;


	system("pause");
	return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值