使用迭代器指定范围,使用函数作为参数处理数据。
1.模板提供泛型类型 2.迭代器提供数据的通用访问表示
前三组定义在algorithm头文件中,最后一组定义在numeric头文件中 1.非修改序列操作组:对范围内的每个元素进行操作。这些操作保持容器不变;find(),for_each() 2.突变序列操作组:也可以对范围内的每个元素进行操作。可以改变或改变容器的内容(更改值或更改顺序);transform(),random_shuffle(),copy() 3.排序和相关操作组:包括几个排序函数(包括sort())和各种其他函数,包括集合操作。 4.数据操作组:包括对范围内的数据求和、计算两个容器的内积、计算部分和、计算相邻差等等;它的操作主要是针对数组,因此vector是其主要操作容器
这个声明告诉你range形参必须是输入迭代器或更好的,指示结果位置的迭代器必须是输出形参或更好的:
templateOutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);
根据处理后的元素被放在哪里对算法进行分类: 1.in-place algorithm:处理后的元素覆盖原始容器 2.copying algorithm:处理后的元素复制给别的容器 3.一些算法有两种版本:一个in-place algorithm版本,一个copying algorithm版本,比如transform()可以输出到别的容器,也允许输出给输入的容器。 STL约定给函数名添加 _ copy 后缀指定复制版本,复制版本将接收一个额外的输出迭代器参数,该参数指定结果的放置位置。
//一般版本 templatevoid replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); //复制版本---返回的迭代器指向复制的最后一个值后面的一个位置。 template OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value);
4.还有一种变体,根据 对容器元素执行操作 的返回条件(当返回true时执行)决定是否对该元素执行操作。 STL规定给函数名添加if后缀指定条件版本
templatevoid replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);//Predicate为返回一个bool值的仿函数
5.既是复制版本也是if版本,给函数名添加_copy_if后缀指定
前面的ForwardIterator、InputIterator、Predicate等等都是STL给程序员的提示,但是编译器无法检查这些名称(C++没有真的实现这种类,只是一种理论) 如果使用了错误类型的迭代器,在编译器试图实例化模板时,您可能会看到一长串错误消息。
此处就是讲了对string字符串的排列 next_permutation(letters.begin(), letters.end())---就是对letters(string类)进行一个排列,不断获取排列(成功返回true)直到所有排列获取完成,函数返回false,只提供不重复的排列
有些时候既可以使用函数也可以使用容器方法,但是建议使用容器方法,原因如下: 1.针对特定的容器,容器方法的实现更贴合 2.作为成员函数,可以使用模板类存储管理机制,可以根据需要调整容器的大小,虽然容器方法更合适,但是函数更泛化。
STL是一个库,它的各个部分被设计成协同工作。STL组件是工具,但它们也是创建其他工具的构建块。 使用STL的原则时尽量少自己敲代码。 举例为:首先输入n个单词,然后将其存储及显示;不区分大小写地记录不重复的单词并存储显示,计算每个单词出现的次数并存储显示
代码
/* Project name : _29Algorithms Last modified Date: 2022年4月19日11点09分 Last Version: V1.0 Descriptions: 算法 */ /* 算法特点:使用迭代器指定范围,使用函数作为参数处理数据。 算法的两个主要泛型元素: 1.模板提供泛型类型 2.迭代器提供数据的通用访问表示 算法分组: 前三组定义在algorithm头文件中,最后一组定义在numeric头文件中 1.非修改序列操作组:对范围内的每个元素进行操作。这些操作保持容器不变;find(),for_each() 2.突变序列操作组:也可以对范围内的每个元素进行操作。可以改变或改变容器的内容(更改值或更改顺序);transform(),random_shuffle(),copy() 3.排序和相关操作组:包括几个排序函数(包括sort())和各种其他函数,包括集合操作。 4.数据操作组:包括对范围内的数据求和、计算两个容器的内积、计算部分和、计算相邻差等等;它的操作主要是针对数组,因此vector是其主要操作容器 算法的一般性质: 使用InputIterator和OutputIterator说明需要使用的是输入迭代器 templateOutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); 根据处理后的元素被放在哪里对算法进行分类: 1.in-place algorithm:处理后的元素覆盖原始容器 2.copying algorithm:处理后的元素复制给别的容器 3.一些算法有两种版本:一个in-place algorithm版本,一个copying algorithm版本,比如transform()可以输出到别的容器,也允许输出给输入的容器。 STL约定给函数名添加_copy后缀指定复制版本,复制版本将接收一个额外的输出迭代器参数,该参数指定结果的放置位置。 //一般版本 template void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); //复制版本---返回的迭代器指向复制的最后一个值后面的一个位置。 template OutputIterator replace_copy(InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value); 4.还有一种变体,根据 对容器元素执行操作 的返回条件(当返回true时执行)决定是否对该元素执行操作。 STL规定给函数名添加_if后缀指定条件版本 template void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value);//Predicate为返回一个bool值的伪函数 5.既是复制版本也是if版本,给函数名添加_copy_if后缀指定 注意事项:前面的ForwardIterator、InputIterator、Predicate等等都是STL给程序员的提示,但是编译器无法检查这些名称(C++没有真的实现这种类,只是一种理论) 如果使用了错误类型的迭代器,在编译器试图实例化模板时,您可能会看到一长串错误消息。 STL和string类 此处就是讲了对string字符串的排列 next_permutation(letters.begin(), letters.end())---就是对letters(string类)进行一个排列,不断获取排列(成功返回true)直到所有排列获取完成,函数返回false 只提供不重复的排列 函数 VS 容器方法:有些时候既可以使用函数也可以使用容器方法,但是建议使用容器方法,原因如下: 1.针对特定的容器,容器方法的实现更贴合 2.作为成员函数,可以使用模板类存储管理机制,可以根据需要调整容器的大小 虽然容器方法更合适,但是函数更泛化。 使用STL:STL是一个库,它的各个部分被设计成协同工作。STL组件是工具,但它们也是创建其他工具的构建块。 使用STL的原则时尽量少自己敲代码。 举例为:首先输入n个单词,然后将其存储及显示;不区分大小写地记录不重复的单词并存储显示,计算每个单词出现的次数并存储显示 */ // strgstl.cpp -- applying the STL to a string #include #include #include #include #include
#include #include
运行结果
string class and STL************************************************************** Enter the letter grouping (quit to quit): liy Permutations of liy ily iyl liy lyi yil yli Enter next sequence (quit to quit): quit Functions Versus Container Methods*********************************************** Original list contents: 4 5 4 2 2 3 4 8 1 4 After using the remove() method: la: 5 2 2 3 8 1 After using the remove() function: lb: 5 2 2 3 8 1 4 8 1 4 After using the erase() method: lb: 5 2 2 3 8 1 Using the STL****************************************************************** Enter words (enter quit to quit): lit quit You entered the following words: lit Alphabetic list of words: lit Word frequency: lit: 1 D:\Prj\_C++Self\_29Algorithms\x64\Debug\_29Algorithms.exe (进程 2996)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .