1. 程式人生 > >程式設計與演算法(三)第九周 標準模板庫STL(二)(2)

程式設計與演算法(三)第九周 標準模板庫STL(二)(2)

STL演算法(一)

STL演算法分類

  • 不變序列演算法
  • 變值演算法
  • 刪除演算法
  • 變序演算法
  • 排序演算法
  • 有序區間演算法
  • 數值演算法

大多數過載的演算法都是有兩個版本的

  • 用“==”判斷元素是否相等,或用“<”來比較大小
  • 多出一個型別引數“Pred"和形參“Pred op":通過表示式“op(x, y)”的返回值:true/false判斷x是否“等於”y,或者x是否“小於”y
  • 如有以下兩個版本min_element:iterator min_element(iterator first, iterator last)
  • iterator min_element(iterator first, iterator last, Pred op)

不變序列演算法

  • 該演算法不會修改演算法所作用的容器或物件
  • 適用於順序容器和關聯容器
  • 時間複雜度都是O(n)
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

一個例子:

#include <iostream>
#include <algorithm>
using namespace std;
class A{
public:
    int n;
    A(int i):n(i){}
};
bool operator<(const A& a1, const A& a2){
    cout<<"< called"<<endl;
    if(
a1.n==3&&a2.n==7){return true;} return false; } int main() { A aa[]={3,5,7,2,1}; cout<<min_element(aa,aa+5)->n<<endl; cout<<max_element(aa, aa+5)->n<<endl; return 0; }
< called
< called
< called
< called
3
< called
< called
< called
< called
7

上面講了min_element的過程,就是,把第一個元素3拿出來作為最小值,然後和第二個元素5比較,如果5<3則最小值變為5,由於過載了"<"那麼只有當傳入的數字是3和7的時候,才為true,顯然,沒有這個組合,因此,最小值為3。

下面是自己的例子,大概看了下,min_element和max_element都呼叫了<(p1, p2) 這個函式,不同的是,最小值是把result傳在了第二個引數,如果第一個引數p1<p2返回true,那麼p2 = p1;最大值是把result傳在了第一個引數,如果p1<p2返回true,那麼p1 = p2;

#include <iostream>
#include <algorithm>
using namespace std;
class A{
public:
    int n;
    A(int i):n(i){}
};
bool operator<(const A& a1, const A& a2){
    cout<<"a1 "<<a1.n<<" a2 "<<a2.n<<endl;
    return a1.n<a2.n;
}
int main()
{
    A aa[]={7,3,5,7,6};
    cout<<min_element(aa, aa+5)->n<<endl;
    cout<<max_element(aa, aa+5)->n<<endl;
    return 0;
}
a1 3 a2 7
a1 5 a2 3
a1 7 a2 3
a1 6 a2 3
3
a1 7 a2 3
a1 7 a2 5
a1 7 a2 7
a1 7 a2 6
7

變值演算法

此類演算法會修改源區間或目標區間元素的值

值被修改的那個區間,不可以是屬於關聯容器的

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

這個是個例子

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
class CLessThen9{
public:
    bool operator()(int n){return n<9;}
};
void outputSquare(int value){cout<<value*value<<" ";}
int calculateCube(int value){return value*value*value;}
int main()
{
    const int SIZE=10;
    int a1[]={1,2,3,4,5,6,7,8,9,10};
    int a2[]={100,2,8,1,50,3,8,9,10,2};
    vector<int> v(a1, a1+SIZE);
    ostream_iterator<int> output(cout, " ");
    random_shuffle(v.begin(), v.end());
    cout<<endl<<"1)";
    copy(v.begin(), v.end(), output);
    copy(a2, a2+SIZE, v.begin());
    cout<<endl<<"2)";
    cout<<count(v.begin(), v.end(), 8);
    cout<<endl<<"3)";
    //clessthen9是一個函式物件,然後count_if呼叫的是clessthen9.operator(int n)?=true
    cout<<count_if(v.begin(), v.end(), CLessThen9());
    cout<<endl<<"4)";
    cout<<*(min_element(v.begin(), v.end()));
    cout<<endl<<"5)";
    cout<<*(max_element(v.begin(), v.end()));
    cout<<endl<<"6)";
    cout<<accumulate(v.begin(), v.end(), 0);
    cout<<endl<<"7)";
    for_each(v.begin(), v.end(), outputSquare);
    vector<int> cubes(SIZE);
    transform(a1, a1+SIZE, cubes.begin(), calculateCube);
    cout<<endl<<"8)";
    copy(cubes.begin(), cubes.end(), output);
    return 0;
}
1)5 4 8 9 1 6 3 2 7 10 
2)2
3)6
4)1
5)100
6)193
7)10000 4 64 1 2500 9 64 81 100 4 
8)1 8 27 64 125 216 343 512 729 1000 

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述