标准库为容器类型定义的操作很少,并没有为每个容器实现更多的操作。因为这部分操作可以抽象出来为所有的容器工作,那就是泛型算法。所谓“泛型”是指这些算法可以应用于多种容器类型上,而容器内的元素类型也可以多样化。标准库提供了100多个泛型算法,主要定义于头文件<algorithm>中,还有一组泛化的算术算法定义于头文件<numeric>中。
大多数泛型算法是工作于容器的一对迭代器所标识的范围,并完全通过迭代器来实现其功能。这段由迭代器指定的范围称为“输入范围”。带有输入范围参数的算法总是使用前两个参数标记该范围,分别指向要处理的第一个元素和最后一个元素的下一个位置。
1 查找对象的算法
find 和 count 算法在输入范围中查找指定值。find 算法返回引用第一个匹配元素的迭代器,count 算法返回元素在输入序列中出现次数的计数。
find(beg, end, val)
count(beg, end, val)
在输入范围中查找等于 val 的元素,使用基础类型的相等(==)操作符。find 返回第一个匹配元素的迭代器,如果不存在在匹配元素就返回 end。count 返回 val 出现次数的计数。
find_first_of(beg1, end1, beg2, end2)
find_first_of算法在第一个范围中查找与第二个范围中任意元素相等的第一个(或最后一个)元素。beg1 和 end1 的类型必须完全匹配,beg2 和 end2 的类型也必须完全匹配。
2. 写元素的算法
swap(elem1, elem2)
swap_ranges(beg1, end1, beg2)
fill(beg, end, val)
3 排序算法
sort(beg, end) 对给定区间所有元素进行排序
stable_sort(beg, end) 对给定区间所有元素进行稳定排序
sort(beg, end, comp)
stable_sort(beg, end, comp)
unique(beg, end)
升序:sort(begin,end,less<data-type>());
降序:sort(begin,end,greater<data-type>()).
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[10]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<10;i++) cout<<a[i]<<" ";
cout<<endl;
sort(a,a+10,greater<int>());
for(i=0;i<10;i++) cout<<a[i]<<" ";
cout<<endl;
}
当然,也可以自己写比较函数
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct Data
{
char data[100];
}str[100];
bool cmp(const Data &elem1, const Data &elem2)
{
if (strcmp(elem1.data, elem2.data) < 0)
return true;
return false;
}
int main()
{
int n, i;
while (cin>>n)
{
for (i=0; i<n; ++i)
{
cin>>str[i].data;
}
sort(str, str+n, cmp);
for (i=0; i<n; ++i)
cout<<str[i].data<<endl;
}
return 0;
}
unique函数
unique的作用是从输入序列中删除”所有相邻的重复元素。该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。
// sort words alphabetically so we can find the duplicates
sort(words.begin(), words.end());
/* eliminate duplicate words:
* unique reorders words so that each word appears once in the
* front portion of words and returns an iterator one past the
unique range;
* erase uses a vector operation to remove the nonunique elements
*/
vector<string>::iterator end_unique = unique(words.begin(), words.end());
words.erase(end_unique, words.end());
在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。
4. 最大值和最小值
min(val1, val2)
min(val1, val2, comp)
max(val1, val2)
max(val1, val2, comp)
min_element(beg, end)
min_element(beg, end, comp)
max_element(beg, end)
max_element(beg, end, comp)