算法命名规范
2023年12月25日 2023年12月25日
除了参数规范,算法还遵循一套命名和重载规范
这些规范处理诸如:
- 提供一个操作代替默认的小于运算符
<
和相等运算符==
- 算法将输出数据写回输入序列还是一个分离的目的位置
…
接受谓词来代替小于运算符或相等运算符的算法
这些算法通常不接受额外参数
提供接受谓词的重载版本
如unique算法:
- 默认使用元素的相等运算符
1unique(beg, end);
- 接受谓词的重载版本
1unique(beg, end, comp); // 使用comp比较元素
接受一个元素值的算法
这些算法通常提供不同名的另一个实现, 使用谓词返回布尔值来代替元素判等
接受谓词的版本添加了后缀 _if
如find算法:
- 默认查找与给定值相等的(第一个)元素
1find(beg, end, val);
- find_if查找令给定谓词为真的(第一个)元素
1find_if(beg, end, pred);
二者形参个数相同
避免任何可能的歧义,标准库选择提供不同名字的版本而不是重载
使用输入序列构造新序列的算法
默认情况下, 重排算法会将新序列写回输入序列
这些算法提供另一个版本, 使用 _copy
后缀标识, 接受一个输出迭代器, 将新序列写到输出序列; 输入序列不发生改变
一些算法同时提供 _copy
和 _if
版本
这些版本接受表示输出序列的输出迭代器, 以及一个谓词
如remove:
- 删除使谓词为真的(第一个)元素
1remove_if(v1.begin(), v1.end(), [](int i) { return i % 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