通用的(泛型)演算法 之 只讀演算法,寫演算法,排序演算法 只讀演算法: | 函數名 | 功能描述 | | | | | accumulate | 求容器里元素的和 | | equal | 比較2個容器里的元素 | 寫演算法 | 函數名 | 功能描述 | | | | | fill | 用給定值,覆蓋給定的範圍的元 ...
通用的(泛型)演算法 之 只讀演算法,寫演算法,排序演算法
只讀演算法:
函數名 | 功能描述 |
---|---|
accumulate | 求容器里元素的和 |
equal | 比較2個容器里的元素 |
寫演算法
函數名 | 功能描述 |
---|---|
fill | 用給定值,覆蓋給定的範圍的元素 |
fill_n | 用給定值,覆蓋給定開始位置後的,n個元素變 |
back_inserter | 在容器末尾插入元素 |
copy | 把容器1指定範圍里的值拷貝給容器2,並返回指向容器2最後一個元素的下個元素 |
replace | 用某個值替換掉給定範圍的某個值 |
replace_copy | 用某個值替換掉給定範圍的某個值,但不改變原來的容器,把結果給新的容器 |
排序演算法
函數名 | 功能描述 |
---|---|
sort | 從小到大排序 |
unique | 把不重覆的元素放在容器的前面,重覆的放在後面,並返回重覆部分的第一個位置 |
include <iostream>
#include <array>
#include <vector>
#include <algorithm>
#include <list>
#include <deque>
#include <numeric>
#include <forward_list>
using namespace std;
int main(){
//只讀演算法
//1,求容器里元素的和
/*
forward_list<int> fl{1,2,3,4,5};
//第三個參數為sum的初始值
int sum = accumulate(fl.cbegin(),fl.cend(),0);
cout << sum << endl;
vector<string> svec{"aa","bb","cc"};
string str = accumulate(svec.cbegin(),svec.cend(),string(""));
//錯誤:const char*上沒有定義+運算符
//string err = accumulate(svec.cbegin(),svec.cend(),"");
cout << str << endl;
*/
//2,比較2個容器里的元素
//如果把svec里放的是const char*,執行結果和string一樣
/*
vector<string> svec{"aa","bb","cc","dd"};
list<const char*> lc{"bb","cc"};
//頭2個參數為第一個容器的區間,第三個參數為第二個容器的首元素
auto result = equal(svec.cbegin()+1,svec.cend()-1, lc.cbegin());
cout << result << endl;
*/
//寫演算法
//1,填充fill演算法
/*
array<int, 6> ar{1,2,3,4,5,6};
cout << ar.size() << endl;
//vector<int> ar{1,2,3,4,5};
//把指定範圍內的值變為9
fill(ar.begin(),ar.begin() + ar.size()/2,9);
for(auto const &s : ar){
cout << s << " ";
}
cout << endl;
cout << ar.size() << endl;
*/
//2,填充fill_n演算法
/*
int ir[] = {1,2,3,4,5,6};
//指定位置開始,後3個元素變為9
fill_n(begin(ir)+1,3,9);
for(auto const &s : ir){
cout << s << " ";
}
cout << endl;
*/
//3,插入迭代器back_inserter
//在容器末尾插入元素
/*
vector<int> ivec{1,0};
auto it = back_inserter(ivec);
fill_n(it,3,99);
for(auto const &s : ivec){
cout << s << " ";
}
cout << endl;//1,0,99,99,99
*/
//4,copy演算法
/*
int a1[] = {1,2,3,4,5};
int a2[sizeof(a1) / sizeof(*a1)];
//把a1指定範圍里的值拷貝給a2,ret指向a2最後一個元素的下個元素
auto ret = copy(begin(a1), end(a1), a2);
//ret-1為數組a2的最後一個元素的地址
*(ret-1) = 100;
for(auto const &s : a2){
cout << s << " ";
}
cout << endl;
//ret和end(a2)指向同一個地址
if(ret == end(a2)){
cout << "true" << endl;
}
else{
cout << "false" << endl;
}
*/
//5,replace演算法
/*
list<int> il{1,2,2,2,5};
//把範圍內的2替換成23
replace(il.begin(), il.end(),2,43);
for(auto const &s : il){
cout << s << " ";
}
cout << endl;
list<int> ila{1,2,2,2,5};
vector<int> ivec;
replace_copy(ila.begin(),ila.end(),back_inserter(ivec),2,23);
for(auto const &s : ivec){
cout << s << " ";
}
cout << endl;
//不改變ila
for(auto const &s : ila){
cout << s << " ";
}
cout << endl;
*/
//重新排列演算法(鏈表list和forward_list不支持sort)
//實現刪除重覆的元素
deque<string> sli =
{"one","two","one","three","two","four","two"};
for(auto const &s : sli){
cout << s << " ";
}
cout << endl;
//從小到大排序
sort(sli.begin(),sli.end());
for(auto const &s : sli){
cout << s << " ";
}
cout << endl;
//把有重覆的元素放到末尾,並返回不重覆元素的下一位置
auto end_unique = unique(sli.begin(),sli.end());
//刪除掉重覆的元素
sli.erase(end_unique, sli.end());
for(auto const &s : sli){
cout << s << " ";
}
cout << endl;
cout << "size: " << sli.size() << endl;//size: 4
}