c++基础(四)—— 泛型算法

1.find(first, last, value)

  • 头文件:algorithm
  • 参数:前两个参数是“表示元素范围的迭代器”,第三个是一个值
  • 说明:find 将范围中进行寻找。搜索失败:如果范围中无匹配元素,则find返回第二个参数来表示。搜索成功:返回指向第一个等于给定值的迭代器。
  • 示例:
  •  1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 using namespace std;
     5 
     6 int main() {
     7     
     8     int v1 = 5;
     9     int a1 = 4;
    10 
    11     vector<int> v{ 0, 1, 2, 3, 4 };
    12     int a[] = { 0, 1, 2, 3, 4 };
    13 
    14     //  可用 auto 替代
    15     vector<int>::iterator result1 = find(v.begin(), v.end(), v1);
    16     int *result2 = find(begin(a), end(a), a1);
    17 
    18     if (result1 == v.end()) {
    19         cout << "v not found "<< v1 << endl;
    20     } else {
    21         cout << "v found " << v1 << endl;
    22     }
    23 
    24     if (result2 == end(a)) {
    25         cout << "a not found " << a1 << endl;
    26     } else {
    27         cout << "a found " << a1 << endl;  // 可见 *(end(a))!=4. 而 *(begin(a))==0
    28     }
    29  
    30     getchar();
    31     return 0;
    32 }

  

2.find_if(first, last, p)

  • 头文件:algorithm
  • 参数:前两个参数表示范围,第三个参数是一个谓词 (只接受单一参数的函数)
  • 说明:对输入序列中的每个元素条用给定的这个谓词。搜索失败:返回尾迭代器。搜索成功:返回第一个使谓词返回非0值的元素。
  • 示例:
  •  1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 using namespace std;
     5 
     6 int judge(int i) { // 一元谓词,只能传入一个参数
     7     return i % 2;
     8 }
     9 
    10 int main() {
    11  
    12 
    13     vector<int> v{ 0, 2, 7, 5 };
    14 
    15     //  可用 auto 替代
    16     vector<int>::iterator result1 = find_if(v.begin(), v.end(), judge);// 返回第一个奇数
    17 
    18     if (result1 != v.end()) {
    19         cout << "第一个奇数:"<< *result1 << endl;
    20     } else {
    21         cout << "无奇数 " << endl;
    22     }
    23 
    24  
    25     getchar();
    26     return 0;
    27 }

     

3.back_inserter(Container& c )

  • 头文件:iterator
  • 参数:接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。
  • 说明:当我们通过此迭代器赋值时,赋值运算符会调用 push_back 将一个具有给定值的元素添加到容器
  • 示例:
  •  1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 #include<iterator>
     5 using namespace std;
     6 
     7 int main() {
     8 
     9     vector<int> v4;
    10     auto iter = back_inserter(v4);
    11     //back_insert_iterator<vector<int>> iter = back_inserter(v4);
    12     *iter = 44;
    13     for (auto elem : v4) {
    14         std::cout << elem << " ";
    15     }
    16  
    17     getchar();
    18     return 0;
    19 }

     

4.fill(first, last, value),fill_n(first, count, value)

  • 头文件:algorithm
  • 参数:fill——接受一对迭代器表示一个范围,还接受一个值作为第三个参数将给定的这个值赋予输入序列中的每个元素fill_n——接受一个单迭代器、一个计数值和一个值。它将给定值赋予迭代器指向的元素开始的指定个元素。
  • 说明:fill 可以对空容器操作,但是 fill_n 不能对空容器操作(但是可用 back_inserter 解决)。
  • 示例:
  •  1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 #include<iterator>
     5 using namespace std;
     6 
     7 int main() {
     8  
     9     /// fill
    10     vector<int>  v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    11     //vector<int>  v; // 容器为空。可以使用
    12     fill(v.begin(), v.end(), 99);
    13     for (auto elem : v) {
    14         std::cout << elem << " ";
    15     }
    16     cout << endl;
    17 
    18     ///fill_n
    19     vector<int>  v2{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    20     fill_n(v2.begin(), 5, 99);
    21     for (auto elem : v2) {
    22         std::cout << elem << " ";
    23     }
    24     cout << endl;
    25     
    26     vector<int> v3; // 容器为空(使用错误)
    27     //fill_n(v3.begin(), 5, 99); // 报错
    28     //使用back_inerter解决
    29     fill_n(back_inserter(v3), 10, -1);
    30     for (auto elem : v3) {
    31         std::cout << elem << " ";
    32     }
    33 
    34  
    35     getchar();
    36     return 0;
    37 }

     

5.copy(first, last, d_first)

  • 头文件:algorithm
  • 参数:前两个表示输入范围,第三个表示目的序列的起始位置。传递给copy的目的序列至少要包含与输入序列一样多的元素!
  • 说明:copy返回值:copy返回的是其目的位置迭代器(递增后)的值。
  • 示例:
  •  1 #include<iostream>
     2 #include<algorithm>
     3 #include<vector>
     4 #include<iterator>
     5 using namespace std;
     6 
     7 int main() {
     8  
     9     vector<int>  v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    10     vector<int>  v2;
    11     //auto result = copy(v.begin(), v.end(), v2.begin());//报错。v2为空
    12     auto result = copy(v.begin(), v.end(), back_inserter(v2));
    13     for (auto elem : v2) {
    14         cout << elem << " ";
    15     }
    16     cout << endl;
    17 
    18     //我们可以用copy实现内置数组的拷贝
    19     int a1[] = { 0,1,2,3,4,5,6,7,8,9 };
    20     int a2[sizeof(a1) / sizeof(*a1)];    //a2与a1大小一样
    21     //ret指向拷贝到a2的尾元素之后的位置
    22     auto ret = copy(begin(a1), end(a1), a2);    //    把a1的内容拷贝给a2
    23     for (auto elem : a2) {
    24         cout << elem << " ";
    25     }
    26     cout << *(--ret) << " "; // 输出9。ret恰好指向拷贝到a2的尾元素之后的位置。
    27 
    28  
    29     getchar();
    30     return 0;
    31 }

     

6.replace(first, last, old_value, new_value)

  • 头文件:algorithm
  • 参数:前两个是迭代器,表示输入序列,后两个一个是要搜索的值,另一个是新值。

 

7.sort(first, last),sort(first, last, comp)

  • 头文件:algorithm
  • 参数:排序范围。comp——比较函数对象(即满足比较(Compare) 概念的对象),若第一参数小于(即先序于)第二参数则返回 ​true 。比较函数的签名应等价于如下:bool cmp(const Type1 &a, const Type2 &b);
  • 说明:默认情况 sort 是按照 < 运算符进行运算
  • 示例:
  •  1 #include <algorithm>
     2 #include <functional>
     3 #include <array>
     4 #include <iostream>
     5 
     6 int main()
     7 {
     8     std::array<int, 10> s = { 5, 7, 4, 2, 8, 6, 1, 9, 0, 3 };
     9 
    10     // 用默认的 operator< 排序
    11     std::sort(s.begin(), s.end());
    12     for (auto a : s) {
    13         std::cout << a << " ";  //0 1 2 3 4 5 6 7 8 9 
    14     }
    15     std::cout << '\n';
    16 
    17     // 用标准库比较函数对象排序
    18     std::sort(s.begin(), s.end(), std::greater<int>());
    19     for (auto a : s) {
    20         std::cout << a << " "; //9 8 7 6 5 4 3 2 1 0 
    21     }
    22     std::cout << '\n';
    23 
    24     // 用自定义函数对象排序
    25     struct {
    26         bool operator()(int a, int b) const
    27         {
    28             return a < b;
    29         }
    30     } customLess;
    31     std::sort(s.begin(), s.end(), customLess);
    32     for (auto a : s) {
    33         std::cout << a << " "; //0 1 2 3 4 5 6 7 8 9 
    34     }
    35     std::cout << '\n';
    36 
    37     // 用 lambda 表达式排序
    38     std::sort(s.begin(), s.end(), [](int a, int b) {
    39         return b < a;
    40     });
    41     for (auto a : s) {
    42         std::cout << a << " "; //9 8 7 6 5 4 3 2 1 0
    43     }
    44     std::cout << '\n';
    45 }

     

posted @ 2019-08-16 16:14  孔胡子  阅读(190)  评论(0编辑  收藏  举报