C++進(jìn)階:STL算法1--填充、遍歷與變換

1. 簡(jiǎn)介

1.1 填充

函數(shù) 作用 文檔
fill(beg,end,val) 將值val賦給[beg,end)范圍內(nèi)的所有元素。 fill()
fill_n(beg,n,val) 將值val賦給[beg,beg+n)范圍內(nèi)的所有元素。 fill_n()
generate(beg,end,func) 連續(xù)調(diào)用函數(shù)func填充[beg,end)范圍內(nèi)的所有元素。 generate()
generate_n(beg,n,func) 連續(xù)調(diào)用函數(shù)func填充[beg,beg+n)范圍內(nèi)的所有元素。 generate_n()
  • fill()/fill_n()用于填充相同值,generate()/generate_n()用于填充不同值。

1.2 遍歷/變換

函數(shù) 作用 文檔
for_each(beg,end,func) 將[beg,end)范圍內(nèi)所有元素依次調(diào)用函數(shù)func,返回func。不修改序列中的元素。 for_each()
transform(beg,end,res,unary) 將[beg,end)范圍內(nèi)所有元素依次調(diào)用函數(shù)unary,結(jié)果放入res中。 transform()
transform(beg2,end1,beg2,res,binary) 將[beg,end)范圍內(nèi)所有元素與[beg2,beg2+end-beg)中所有元素依次調(diào)用函數(shù)unary,結(jié)果放入res中。 transform()

2. 示例代碼

  • fill.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline void Display(int t){
    cout << t << " "; 
}
int main(){
    // 構(gòu)造函數(shù)方式(vector、list、deque都有此構(gòu)造函數(shù))
    vector<int> vec1(10,100);

    for_each(vec1.begin(),vec1.end(),Display);
    cout<< endl;

    // 算法方式
    vector<int> vec2(10);
    fill(vec2.begin(),vec2.end(),100);
    for_each(vec2.begin(),vec2.end(),Display);
    cout<< endl;

    // 數(shù)組方式
    int arr[10];
    fill(arr,arr+10,100);
    for_each(arr,arr+10,Display);
    cout<< endl;
}
  • fill_n.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline void Display(int t){
    cout << t << " "; 
}
int main(){
    // 構(gòu)造函數(shù)方式(vector、list、deque都有此構(gòu)造函數(shù))
    vector<int> vec1(10,100);

    for_each(vec1.begin(),vec1.end(),Display);
    cout<< endl;

    // 算法方式
    vector<int> vec2(10);
    fill_n(vec2.begin(),10,100);
    for_each(vec2.begin(),vec2.end(),Display);
    cout<< endl;

    // 數(shù)組方式
    int arr[10];
    fill_n(arr,10,100);
    for_each(arr,arr+10,Display);
    cout<< endl;
}
  • generate
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline int Increase(){
    static int i = 0;
    return i++;
}
inline void Display(int t){
    cout << t << " "; 
}
int main(){

    // 容器方式
    vector<int> vec(10);
    generate(vec.begin(),vec.end(),Increase);
    for_each(vec.begin(),vec.end(),Display);
    cout<< endl;
    
    // 數(shù)組方式
    int arr[10];
    generate(arr,arr+10,Increase);
    for_each(arr,arr+10,Display);
    cout<< endl;
}
  • generate_n
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline int Increase(){
    static int i = 0;
    return i++;
}
inline void Display(int t){
    cout << t << " "; 
}
int main(){

    // 容器方式
    vector<int> vec(10);
    generate_n(vec.begin(),10,Increase);
    for_each(vec.begin(),vec.end(),Display);
    cout<< endl;
    
    // 數(shù)組方式
    int arr[10];
    generate_n(arr,10,Increase);
    for_each(arr,arr+10,Display);
    cout<< endl;
}
  • for_each.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline void Display(int t){
    cout << t << " "; 
}
int main(){
    // 容器方式
    vector<int> vec(10,100);
    for_each(vec.begin(),vec.end(),Display);
    cout<< endl;

    // 數(shù)組方式
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    for_each(arr,arr+10,Display);
    cout<< endl;
}
  • transform.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline void Display(int t){
    cout << t << " "; 
}
inline int Increase(int t){
    return t+1;
}
inline int Plus(int a,int b){
    return a+b;
}
int main(){
    // 容器方式
    vector<int> vec(10,100);
    vector<int> res1(10);
    transform(vec.begin(),vec.end(),res1.begin(),Increase);
    for_each(res1.begin(),res1.end(),Display);
    cout<< endl;

    // 數(shù)組方式
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int res2[10];
    transform(arr,arr+10,res2,Increase);// 可用仿函數(shù)
    for_each(res2,res2+10,Display);
    cout<< endl;

    // 容器方式
    vector<int> vec1(10,100);
    vector<int> vec2(10,1);
    vector<int> res3(10);
    transform(vec.begin(),vec.end(),vec2.begin(),res3.begin(),Plus);
    for_each(res3.begin(),res3.end(),Display);
    cout<< endl;

    // 數(shù)組方式
    int arr1[10] = {1,2,3,4,5,6,7,8,9,0};
    int arr2[10] = {1,2,3,4,5,6,7,8,9,0};
    int res4[10];
    transform(arr1,arr1+10,arr2,res4,Plus);// 可用仿函數(shù)
    for_each(res4,res4+10,Display);
    cout<< endl;
}

3. 練習(xí)

  1. 把一個(gè)26字符大小的數(shù)組/向量填充26個(gè)英文字母。
  2. 字符串大小寫轉(zhuǎn)換(提示transform)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容