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);