程式設計與演算法(三)第九周 標準模板庫STL(二)(2)
阿新 • • 發佈:2018-12-13
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