泛型算法只是依赖于迭代器的操作,而不是依赖于容器
泛型算法可以分为3大类:
下面的vec和vec2代表相同类型的容器
1.只读算法:只允许读取其输入范围内的元素,而不改变元素
find(vec.cbegin(), vec.cend(), k)
查找算法:前两个参数表示元素范围的迭代器,第三个参数k表示要查找的元素,查找成功则返回等于第一个元素的迭代器,查找失败返回尾后指针
accumulate(vec.cbegin(), vec.cend(), 0)
求和算法:前两个参数表示元素范围的迭代器,第三个参数表示和的初始值,返回该类型的参数范围内的和,可以为int,string等
equal(vec.cbegin(), vec.cend(), vec2.cbegin() )
比较算法:将第一个范围内的元素和第二个序列中的元素比较,如果对应元素都相等,返回true,否则返回false,这里默认第二个序列的元素数>=第一个范围内的元素数
2.写容器元素算法:将元素写入输入范围
fill(vec.cbegin(), vec.cend(), 0)
表示迭代器范围内的值都被置为0(假设vec存的是int型)
fill_n(vec.begin(), vec.size(), 0)
表示从指定迭代器 vec.begin() 开始以后的vec.size()个元素的值都被置为0(假设vec存的是int型)
注:上面的写算法不允许在空容器上调用,即容器中有几个元素,写算法才能写几个元素,只能修改,不能添加,如果想要添加只能使用插入迭代器(下篇会介绍)
copy(vec.cbegin(), vec.cend(), vec2.cbegin())
拷贝算法:将迭代器范围内的元素拷贝到vec2容器中,这里默认第二个容器的空间能够存储该迭代器范围内的元素
replace(vec.cbegin(), vec.cend(), before, after)
替换算法:将容器迭代器范围内的元素中 所有为before的元素替换为after的元素,before和after分别为存储类型的具体数值
replace_copy(vec.cbegin(), vec.cend(), back_inserter(vec2), before, after)
替换算法:将容器迭代器范围内的元素中 所有为before的元素替换为after的元素,并插入到vec2中,before和after分别为存储类型的具体数值
3.重排容器元素算法
sort(vec.cbegin(), vec.cend())
排序算法:将迭代器范围内的元素按照定义的“<”来进行排序
unique(vec.cbegin(), vec.cend())
排序算法:将迭代器范围内的元素按照unique的标准库算法进行排序,使得不重复的元素出现在开始的位置,并且返回一个指向最后一个不重复元素之后的迭代器
注:要真正删除容器中的元素,必须使用容器操作,泛型算法只是依赖于迭代器的,向容器中插入元素可以不必使用容器操作,可以使用插入迭代器操作。
最全面的STL泛型算法总结:
当前的STL一共有85个通用算法,这些算法可以使用在所有的STL容器上。有的容器拥有与通用算法函数相同功能的成员函数,则优先使用成员函数版本。
所有的这些通用算法在这里可以查询得到。
这些通用算法的参数 和 返回值一般都有迭代器(通过迭代器,将算法与数据结构解耦),用来表示元素在容器中的位置(前后两个迭代器,组成一个左闭右开的区间)。
一、非修改型算法
函数名 | 参数 | 功能 |
---|---|---|
1、 | all_of() | 区间 + 一元谓词 判断区间中所有元素是否都满足谓词条件。 |
2、 | any_of() | 区间 + 一元谓词 判断区间中是否有一个元素满足谓词条件。 |
3、 | none_of() | 区间 + 一元谓词 判断区间中的元素是否都不满足谓词条件。(全部都不满足的否定是至少有一个满足,none_of() 和 any_of() 的结果是对立的)。 |
4、 | for_each() | 区间 + 一元可调用对象 对每个元素都执行该一元操作,注意函数的返回值是该一元操作对象,需要注意当一元操作对象是有状态的情况。 |
5、 | find() |