美文网首页C++
C++标准库学习(三):常用算法

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

作者: Mr希灵 | 来源:发表于2016-03-24 14:48 被阅读497次

    标准库为容器类型定义的操作很少,并没有为每个容器实现更多的操作。因为这部分操作可以抽象出来为所有的容器工作,那就是泛型算法。所谓“泛型”是指这些算法可以应用于多种容器类型上,而容器内的元素类型也可以多样化。标准库提供了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)

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/owtrlttx.html