C++进阶:STL算法1--填充、遍历与变换

96
jdzhangxin
2017.07.24 20:31* 字数 84

1. 简介

1.1 填充

函数 作用 文档
fill(beg,end,val) 将值val赋给[beg,end)范围内的所有元素。 fill()
fill_n(beg,n,val) 将值val赋给[beg,beg+n)范围内的所有元素。 fill_n()
generate(beg,end,func) 连续调用函数func填充[beg,end)范围内的所有元素。 generate()
generate_n(beg,n,func) 连续调用函数func填充[beg,beg+n)范围内的所有元素。 generate_n()
  • fill()/fill_n()用于填充相同值,generate()/generate_n()用于填充不同值。

1.2 遍历/变换

函数 作用 文档
for_each(beg,end,func) 将[beg,end)范围内所有元素依次调用函数func,返回func。不修改序列中的元素。 for_each()
transform(beg,end,res,unary) 将[beg,end)范围内所有元素依次调用函数unary,结果放入res中。 transform()
transform(beg2,end1,beg2,res,binary) 将[beg,end)范围内所有元素与[beg2,beg2+end-beg)中所有元素依次调用函数unary,结果放入res中。 transform()

2. 示例代码

  • fill.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline void Display(int t){
    cout << t << " "; 
}
int main(){
    // 构造函数方式(vector、list、deque都有此构造函数)
    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;

    // 数组方式
    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(){
    // 构造函数方式(vector、list、deque都有此构造函数)
    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;

    // 数组方式
    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;
    
    // 数组方式
    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;
    
    // 数组方式
    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;

    // 数组方式
    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;

    // 数组方式
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int res2[10];
    transform(arr,arr+10,res2,Increase);// 可用仿函数
    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;

    // 数组方式
    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);// 可用仿函数
    for_each(res4,res4+10,Display);
    cout<< endl;
}

3. 练习

  1. 把一个26字符大小的数组/向量填充26个英文字母。
  2. 字符串大小写转换(提示transform)
C/C++开发课程
Web note ad 1