在程序中使用STL(第7章)(条款43)
程序员文章站
2022-07-13 22:08:06
...
条款43:算法调用优先于手写的循环
有三个理由
效率:算法通常比程序员自己写的循环效率更高;
正确性:自己写循环比使用算法更容易出错;
可维护性:使用算法的代码通常比手写循环的代码更加简洁明了;
书中的例子
void dequeTest() {
deque<int> dq{2, 3, 4};
dq.push_back(5);
dq.push_front(1);
auto idq = dq.insert(dq.cbegin(), 0); // 注意,插入后返回插入节点的迭代器
idq = dq.insert(dq.cend(), 6); // 注意,插入后返回插入节点的迭代器
int arr[]{11, 12, 13, 14, 15}; // 测试用数据
const int N = 5;
// 不使用算法的例子,需要消息维护迭代器的有效性
auto initer = dq.begin();
for (int i = 0; i < N; ++i) {
initer = dq.insert(initer, arr[i] + 10);
++initer;
}
// 使用算法的例子
// 1)将数组依次插入到deque后面
std::copy(arr, arr + N, std::back_inserter(dq));
// 2)将数组按照原来的顺序依次+10后插入deque前面,采用lambda表达式实现
std::transform(std::begin(arr), std::end(arr), std::inserter(dq, dq.begin()),
[](int x) { return x + 10; }); // lamada表达式
// 3)将数组按照原来的顺序依次+10后插入deque前面,采用bind 标准函数对象实现
std::transform(std::begin(arr), std::end(arr), std::inserter(dq, dq.begin()),
std::bind(std::plus<int>(), std::placeholders::_1, 10)); // bind标准函数对象
return;
}
输出:
书中还举了个例子,有些场景下使用循环更清晰,不过作者出版树的时候C++11还没有面世,因此那个例子是合理的,现在有lambda,书中那个例子也可以用算法优雅的完成,代码如下
void dequeTest() {
// 想要表明在一次迭代中完成什么工作,则使用循环比算法更为清晰
std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};
int lowbound = 4;
int upperbound = 6;
auto iter = vec.begin();
for (; iter != vec.end(); ++iter) {
if (*iter > lowbound && *iter < upperbound) {
break; // *iter == 5
}
}
// 然而新版的C++也不是如此了,以前做法确实比较麻烦,还需要写个函数对象,或者采用其他方式,现在有lambda
auto i = std::find_if(vec.begin(), vec.end(), [=](int e) { return e > lowbound && e < upperbound; });
return;
}
推荐阅读