下载本文示例代码
算法是模板中使用的函数。这才真正开始体现STL的强大之处。你可以学习一些大多数模板容器中都会用到的一些算法函数,这样你可以通过最简便的方式进行排序、查找、交换等操作。STL中包含着一系列实现算法的函数。比如:sort(vec.begin() 1, vec.end()-1)可以实现对除第一个和最后一个元素的其他元素的排序操作。 容器自身不能使用算法,但两个容器中的游标可以限定容器中使用算法的元素。既然这样,算法不直接受到容器的限制,而是通过采用游标,算法才能够得到支持。此外,很多次你会遇到传递一个已经准备好了的函数(以前提到的声明:predicate)作为参数,你也可以传递以前的旧值。 下面的例子演示了怎样使用算法:
//程序:测试分数统计//目的:通过对向量中保存的分数的操作说明怎样使用算法 #include <algorithm> //如果要使用算法函数,你必须要包含这个头文件。#include <numeric> // 包含accumulate(求和)函数的头文件#include <vector>#include <iostream>using namespace std;int testscore[] = {67, 56, 24, 78, 99, 87, 56};//判断一个成绩是否通过了考试bool passed_test(int n){ return (n >= 60);}// 判断一个成绩是否不及格bool failed_test(int n){ return (n < 60);}int main(int argc, char* argv[]){ int total; // 初始化向量,使之能够装入testscore数组中的元素 vector <int> vecTestScore(testscore, testscore sizeof(testscore) / sizeof(int)); vector <int>::iterator vi; // 排序并显示向量中的数据 sort(vecTestScore.begin(), vecTestScore.end()); cout << "Sorted Test Scores:" << endl; for (vi=vecTestScore.begin(); vi != vecTestScore.end(); vi ) { cout << *vi << ", "; } cout << endl; // 显示统计信息 // min_element 返回一个 _iterator_ 类型的对象,该对象指向值最小的那个元素。 //“*”运算符提取元素中的值。 vi = min_element(vecTestScore.begin(), vecTestScore.end()); cout << "The lowest score was " << *vi << "." << endl; //与min_element类似,max_element是选出最大值。 vi = max_element(vecTestScore.begin(), vecTestScore.end()); cout << "The highest score was " << *vi << "." << endl; // 使用声明函数(predicate function,指vecTestScore.begin()和vecTestScore.end())来确定通过考试的人数。 cout << count_if(vecTestScore.begin(), vecTestScore.end(), passed_test) << " out of " << vecTestScore.size() << " students passed the test" << endl; // 确定有多少人考试挂了 cout << count_if(vecTestScore.begin(), vecTestScore.end(), failed_test) <<" out of " << vecTestScore.size() << " students failed the test" << endl; //计算成绩总和 total = accumulate(vecTestScore.begin(), vecTestScore.end(), 0); // 计算显示平均成绩 cout << "Average score was " <<(total / (int)(vecTestScore.size())) << endl; return 0;}
算法是模板中使用的函数。这才真正开始体现STL的强大之处。你可以学习一些大多数模板容器中都会用到的一些算法函数,这样你可以通过最简便的方式进行排序、查找、交换等操作。STL中包含着一系列实现算法的函数。比如:sort(vec.begin() 1, vec.end()-1)可以实现对除第一个和最后一个元素的其他元素的排序操作。 容器自身不能使用算法,但两个容器中的游标可以限定容器中使用算法的元素。既然这样,算法不直接受到容器的限制,而是通过采用游标,算法才能够得到支持。此外,很多次你会遇到传递一个已经准备好了的函数(以前提到的声明:predicate)作为参数,你也可以传递以前的旧值。 下面的例子演示了怎样使用算法:
//程序:测试分数统计//目的:通过对向量中保存的分数的操作说明怎样使用算法 #include <algorithm> //如果要使用算法函数,你必须要包含这个头文件。#include <numeric> // 包含accumulate(求和)函数的头文件#include <vector>#include <iostream>using namespace std;int testscore[] = {67, 56, 24, 78, 99, 87, 56};//判断一个成绩是否通过了考试bool passed_test(int n){ return (n >= 60);}// 判断一个成绩是否不及格bool failed_test(int n){ return (n < 60);}int main(int argc, char* argv[]){ int total; // 初始化向量,使之能够装入testscore数组中的元素 vector <int> vecTestScore(testscore, testscore sizeof(testscore) / sizeof(int)); vector <int>::iterator vi; // 排序并显示向量中的数据 sort(vecTestScore.begin(), vecTestScore.end()); cout << "Sorted Test Scores:" << endl; for (vi=vecTestScore.begin(); vi != vecTestScore.end(); vi ) { cout << *vi << ", "; } cout << endl; // 显示统计信息 // min_element 返回一个 _iterator_ 类型的对象,该对象指向值最小的那个元素。 //“*”运算符提取元素中的值。 vi = min_element(vecTestScore.begin(), vecTestScore.end()); cout << "The lowest score was " << *vi << "." << endl; //与min_element类似,max_element是选出最大值。 vi = max_element(vecTestScore.begin(), vecTestScore.end()); cout << "The highest score was " << *vi << "." << endl; // 使用声明函数(predicate function,指vecTestScore.begin()和vecTestScore.end())来确定通过考试的人数。 cout << count_if(vecTestScore.begin(), vecTestScore.end(), passed_test) << " out of " << vecTestScore.size() << " students passed the test" << endl; // 确定有多少人考试挂了 cout << count_if(vecTestScore.begin(), vecTestScore.end(), failed_test) <<" out of " << vecTestScore.size() << " students failed the test" << endl; //计算成绩总和 total = accumulate(vecTestScore.begin(), vecTestScore.end(), 0); // 计算显示平均成绩 cout << "Average score was " <<(total / (int)(vecTestScore.size())) << endl; return 0;}
下载本文示例代码
STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法STL实践指南之算法
阅读(115) | 评论(0) | 转发(0) |