六一的部落格


关关难过关关过,前路漫漫亦灿灿。



除了参数规范,算法还遵循一套命名和重载规范

这些规范处理诸如:

  1. 提供一个操作代替默认的小于运算符 < 和相等运算符 ==
  2. 算法将输出数据写回输入序列还是一个分离的目的位置



接受谓词来代替小于运算符或相等运算符的算法

这些算法通常不接受额外参数

提供接受谓词的重载版本

如unique算法:

  1. 默认使用元素的相等运算符
    1unique(beg, end);
  2. 接受谓词的重载版本
    1unique(beg, end, comp);        // 使用comp比较元素
    

接受一个元素值的算法

这些算法通常提供不同名的另一个实现, 使用谓词返回布尔值来代替元素判等

接受谓词的版本添加了后缀 _if

如find算法:

  1. 默认查找与给定值相等的(第一个)元素
    1find(beg, end, val);
  2. find_if查找令给定谓词为真的(第一个)元素
    1find_if(beg, end, pred);  
    

二者形参个数相同

避免任何可能的歧义,标准库选择提供不同名字的版本而不是重载


使用输入序列构造新序列的算法

默认情况下, 重排算法会将新序列写回输入序列

这些算法提供另一个版本, 使用 _copy 后缀标识, 接受一个输出迭代器, 将新序列写到输出序列; 输入序列不发生改变


一些算法同时提供 _copy_if 版本

这些版本接受表示输出序列的输出迭代器, 以及一个谓词

如remove:

  1. 删除使谓词为真的(第一个)元素
    1remove_if(v1.begin(), v1.end(), [](int i) { return i % 2; });
  2. 将所有使谓词为假的元素写入新序列
    1remove_copy_if(v1.begin(), v1.end(), back_inserter(v2), [](int i) { return i % 2; });

如reverse

1reverse(beg, end);
2
3reverse_copy(beg, end, dest);

示例

 1#include <iostream>
 2#include <vector>
 3#include <iterator>
 4
 5using namespace std;
 6
 7int main()
 8{
 9    vector<int> v1{1, 2, 3, 4, 5}, v2 = v1, v3;
10
11    remove_if(v2.begin(), v2.end(), [](int i) { return i % 2; });
12    remove_copy_if(v1.begin(), v1.end(), back_inserter(v3), [](int i) { return i % 2; });
13
14    ostream_iterator<int> out(cout, "\t");
15
16    copy(v2.begin(), v2.end(), out);
17    cout << endl;
18
19    copy(v3.begin(), v3.end(), out);
20    cout << endl;
21    return 0;
22}

输出

2	4	3	4	5
2	4

算法命名规范


除了参数规范,算法还遵循一套命名和重载规范

这些规范处理诸如:

  1. 提供一个操作代替默认的小于运算符 < 和相等运算符 ==
  2. 算法将输出数据写回输入序列还是一个分离的目的位置



接受谓词来代替小于运算符或相等运算符的算法

这些算法通常不接受额外参数

提供接受谓词的重载版本

如unique算法:

  1. 默认使用元素的相等运算符
    1unique(beg, end);
  2. 接受谓词的重载版本
    1unique(beg, end, comp);        // 使用comp比较元素
    

接受一个元素值的算法

这些算法通常提供不同名的另一个实现, 使用谓词返回布尔值来代替元素判等

接受谓词的版本添加了后缀 _if

如find算法:

  1. 默认查找与给定值相等的(第一个)元素
    1find(beg, end, val);
  2. find_if查找令给定谓词为真的(第一个)元素
    1find_if(beg, end, pred);  
    

二者形参个数相同

避免任何可能的歧义,标准库选择提供不同名字的版本而不是重载


使用输入序列构造新序列的算法

默认情况下, 重排算法会将新序列写回输入序列

这些算法提供另一个版本, 使用 _copy 后缀标识, 接受一个输出迭代器, 将新序列写到输出序列; 输入序列不发生改变


一些算法同时提供 _copy_if 版本

这些版本接受表示输出序列的输出迭代器, 以及一个谓词

如remove:

  1. 删除使谓词为真的(第一个)元素
    1remove_if(v1.begin(), v1.end(), [](int i) { return i % 2; });
  2. 将所有使谓词为假的元素写入新序列
    1remove_copy_if(v1.begin(), v1.end(), back_inserter(v2), [](int i) { return i % 2; });

如reverse

1reverse(beg, end);
2
3reverse_copy(beg, end, dest);

示例

 1#include <iostream>
 2#include <vector>
 3#include <iterator>
 4
 5using namespace std;
 6
 7int main()
 8{
 9    vector<int> v1{1, 2, 3, 4, 5}, v2 = v1, v3;
10
11    remove_if(v2.begin(), v2.end(), [](int i) { return i % 2; });
12    remove_copy_if(v1.begin(), v1.end(), back_inserter(v3), [](int i) { return i % 2; });
13
14    ostream_iterator<int> out(cout, "\t");
15
16    copy(v2.begin(), v2.end(), out);
17    cout << endl;
18
19    copy(v3.begin(), v3.end(), out);
20    cout << endl;
21    return 0;
22}

输出

2	4	3	4	5
2	4