《我的第一本c++书》学习笔记:STL中的一些通用算法(三)

transform():

前面介绍的copy能移动数据,但在移动中,不能对其进行操作,所以STL提供了transform()来实现这项功能。

其重载了2个函数:

第一个有4个参数:前两个表示输入容器的范围,第三个表示输出的目标容器的起始位置,最后一个表示移动过程中所做的动作。

第二个有5个参数:其他都一样,只是在在第三个参数为第二个输入容器的起始位置。


代码如下:

// k.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>


using namespace std;

int increase(int& nScore)
{
	if (nScore > 30 && nScore < 60 )
	{
		nScore = 60;
	}
	return nScore;
}

int add(int& a, int& b)
{
	return a + b ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vecScoreM;
	vecScoreM.push_back(26);
	vecScoreM.push_back(42);
	vecScoreM.push_back(72);

	vector<int> vecScoreE;
	vecScoreE.push_back(32);
	vecScoreE.push_back(55);
	vecScoreE.push_back(80);

	/*vector<int> vecChangeScore;
	vecChangeScore.resize(vecScore.size());
	
	transform(vecScore.begin(), vecScore.end(), vecChangeScore.begin(), increase);*/


	vector<int> vecScore;
	vecScore.resize(vecScoreM.size());
	transform(vecScoreM.begin(), vecScoreM.end(), vecScoreE.begin(), vecScore.begin(), add);
	
	
	return 0;
}

sort()将容器排序,排序的规则可以自定义。

容器排完序后,可以进行更多操作,用lower_bound()算法和upper_bound()算法获取容器中小于某个值或者大于某个值的临界值位置,也可以使用equal_range()算法获得容器中所有等于某个值的数据范围。

代码:

// k.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>


using namespace std;

int increase(int& nScore)
{
	if (nScore > 30 && nScore < 60 )
	{
		nScore = 60;
	}
	return nScore;
}

int add(int& a, int& b)
{
	return a + b ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vecScoreM;
	vecScoreM.push_back(26);
	vecScoreM.push_back(42);
	vecScoreM.push_back(72);

	vector<int> vecScoreE;
	vecScoreE.push_back(32);
	vecScoreE.push_back(55);
	vecScoreE.push_back(80);

	/*vector<int> vecChangeScore;
	vecChangeScore.resize(vecScore.size());
	
	transform(vecScore.begin(), vecScore.end(), vecChangeScore.begin(), increase);*/


	vector<int> vecScore;
	vecScore.resize(vecScoreM.size());
	transform(vecScoreM.begin(), vecScoreM.end(), vecScoreE.begin(), vecScore.begin(), add);
	
	
	return 0;
}

count和count_if算法

代码:

// k.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>


using namespace std;

bool ispass(int& n)
{
	return n >= 60 ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vecScore;

	vecScore.push_back(72);
	vecScore.push_back(54);
	vecScore.push_back(87);
	vecScore.push_back(60);
	vecScore.push_back(60);

	sort(vecScore.begin(), vecScore.end());

	vector<int>::iterator itpass = 
		upper_bound(vecScore.begin(), vecScore.end(), 59);

	//定义可以保存两个迭代器的pair对象
	pair<vector<int>::iterator, vector<int>::iterator> passScore;
	passScore = equal_range(vecScore.begin(), vecScore.end(), 60 );
	cout<<"刚好及格的人数为:"<<int(passScore.second - passScore.first)<<endl;
	cout<<"及格的人数为:"<<int(vecScore.end() - itpass);


	/*实际上,STL提供了count()和count_if()算法来专门统计容器中符合某个条件的数据的数目
	这里ispass如果是true,则nallpass加1
	int nAllPass = count_if(vecScore.begin(), vecScore.end(), ispass);
	cout<<"及格的人数为:"<<nAllPass<<endl;

	int nPass = count(vecScore.begin(), vecScore.end(), 60);
	cout<<"刚好及格的人数为: "<<nPass<<endl;*/


	return 0;
}


出于有些需要,可以自定义排列:

sort()的第三个参数则为比较函数。

代码如下:

//按两个矩形的长来排列
bool sortByH(Rect rect1, Rect rect2)
{
	return rect1.m_fH < rect2.m_fH ;
}

sort(vecRect.begin(), vecRect.end(), sortByH);

//按两个矩形的宽李艾排列
bool sortByW(Rect rect1, Rect rect2)
{
	return rect1.m_fW < rect2.m_fW ;
}

sort(vecRect.begin(), vecRect.end(), sortByW);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值