网站开发常用技术,wordpress 媒体库清理,1688创业商机网,网络游戏的利弊STL 提供能在各种容器中通用的算法#xff0c;如插入、删除、查找、排序等。算法就是函数模板。算法通过迭代器来操纵容器中的元素。
许多算法操作的是容器上的一个区间#xff08;也可以是整个容器#xff09;#xff0c;因此需要两个参数#xff0c;一个是区间起点元素…STL 提供能在各种容器中通用的算法如插入、删除、查找、排序等。算法就是函数模板。算法通过迭代器来操纵容器中的元素。
许多算法操作的是容器上的一个区间也可以是整个容器因此需要两个参数一个是区间起点元素的迭代器另一个是区间终点元素的后面一个元素的迭代器。
有的算法返回一个迭代器。例如find 算法在容器中查找一个元素并返回一个指向该元素的迭代器。
算法可以处理容器也可以处理普通的数组。
有的算法会改变其所作用的容器。例如 copy将一个容器的内容复制到另一个容器。remove在容器中删除一个元素。random_shuffle随机打乱容器中的元素。fill用某个值填充容器。有的算法不会改变其所作用的容器。例如 find在容器中查找元素。count_if统计容器中符合某种条件的元素的个数。STL 中的大部分常用算法都在头文件 algorithm 中定义。此外头文件 numeric 中也有一些算法。
find 算法和其他算法一样都是函数模板。find 模板的原型如下
template class InIt, class T
InIt find(InIt first, InIt last, const T val);其功能可以是在迭代器 first、last 指定的容器的一个区间 [first, last) 中按顺序查找和 val 相等的元素。如果找到就返回该元素的迭代器如果找不到就返回 last。 [first, last) 这个区间是一个左闭右开的区间即 last 指向的元素其实不在此区间内。按照语法调用 find 模板时first 和 last 只要类型相同就可以不一定必须是迭代器。
演示 find 用法的程序如下
#include vector
#include algorithm
#include iostream
using namespace std;
int main() {int a[10] {10,20,30,40};vectorint v;v.push_back(1); v.push_back(2);v.push_back(3); v.push_back(4); //此后v里放着4个元素1,2,3,4vectorint::iterator p;p find(v.begin(),v.end(),3); //在v中查找3if(p ! v.end()) //若找不到,find返回 v.end()cout 1) * p endl; //找到了p find(v.begin(),v.end(),9);if(p v.end())cout not found endl; //没找到p find(v.begin()1,v.end()-1,4); //在,3 这两个元素中查找4cout 2) * p endl;int * pp find(a,a4,20);if(pp a 4)cout not found endl;elsecout 3) * pp endl;
}程序的输出结果是
3
not found4
20第 11 行要查找的区间是 [v.begin(), v.end( ))v.end() 不在查找范围内因此没有问题。本行的查找会成功因此 p 指向找到的元素 3。
第 17 行因为要查找的区间是 [v.begin()lv.end()-1)这个区间中只有 2、3 这两个元素因此查找会失败p 的值变为 v.end() - 1因此 p 正好指向 4 这个元素。
第 19 行数组 a 是一个容器。数组名 a 的类型是 int 可以做迭代器使用表达式a4的类型也是 int因此也能做迭代器。本次调用 find,查找区间是 [a, a4)即数组 a 的前 4 个元素。如果查找失败find 就会返回 a4。
STL 中还有一个常用的算法 sort用于对容器排序其原型为
templateclass_RandIt
void sort(_RandIt first, _RandIt last);该算法可以用来对区间 [first, last) 从小到大进行排序。下面对数组 a 排序
int a[4] {3, 4, 2, 1};
sort(a, a4);