C++标准库学习(三):常用算法

标准库为容器类型定义的操作很少,并没有为每个容器实现更多的操作。因为这部分操作可以抽象出来为所有的容器工作,那就是泛型算法。所谓“泛型”是指这些算法可以应用于多种容器类型上,而容器内的元素类型也可以多样化。标准库提供了100多个泛型算法,主要定义于头文件中,还有一组泛化的算术算法定义于头文件中。

大多数泛型算法是工作于容器的一对迭代器所标识的范围,并完全通过迭代器来实现其功能。这段由迭代器指定的范围称为“输入范围”。带有输入范围参数的算法总是使用前两个参数标记该范围,分别指向要处理的第一个元素和最后一个元素的下一个位置。


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());
降序:sort(begin,end,greater()).

#include 
#include 
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<());
    for(i=0;i<10;i++)   cout<

当然,也可以自己写比较函数

#include   
#include   
#include   
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>str[i].data;  
        }  
          
        sort(str, str+n, cmp);  
          
        for (i=0; i

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::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)

你可能感兴趣的:(C++标准库学习(三):常用算法)