条款36:了解copy_if的正确实现
STL有很多有趣的地方,其中一个是虽然有11个名字带“copy”的算法:
copy | copy_backward |
replace_copy | reverse_copy |
replace_copy_if | unique_copy |
remove_copy | rotate_copy |
remove_copy_if | partial_sort_copy |
unintialized_copy |
但没有一个是copy_if。这意味着你可以replace_copy_if,你可以remove_copy_if,你可以copy_backward或者reverse_copy,但如果你只是简单地想要拷贝一个区间中满足某个判断式(predicate)的元素,你只能自己做。
比如,假设你有一个函数来决定一个Widget是否有缺陷的:
bool isDefective(const Widget& w);
而且你希望把一个vector中所有有缺陷的Widget写到cerr。如果存在copy_if,你可以简单地这么做:
vector<Widget> widgets; ... copy_if(widgets.begin(), widgets.end(), // 这无法编译: