《C++的十万个为何》[11]用STL为程序减肥

《C++的十万个为什么》[11]用STL为程序减肥
书接上回,
原文来自
http://chenlq.net/11-how-to-use-the-stl-to-lose-weight.html

Q:

在 [9]不要写像王寡妇的裹脚布一样又臭又长的main()函数吗?这篇文章中,我们介绍了如何使用“自顶向下,逐步求精”的设计思想,将一个又臭又长的main()函数分解到多个子函数中,实现了程序的模块化。这样可以让整个程序更加便于实现和维护,但是稍微显得有点臃肿(代码行数增加了不少)。
那么,有没有什么办法可以为程序减减肥,让程序更加优雅?
有,那就是STL。

A:

关于STL的减肥效果,什么三朝秘方,宫廷御用之类的广告,我们这里就不吹嘘了。这里还是就我们讨论的在一个有序的数据序列中插入一个数据为例子,亲身感受一下STL的减肥瘦身效果。
一个程序,无非就是管理数据,然后对数据进行处理得到我们想要的结果。针对程序的这两大任务,STL分别提供了容器和算法来进行处理,而将容器和算法这两个部分连接在一起的,就是迭代器。有了这三件宝贝,STL的减肥效果,那是没多说。
回到这个问题本身,这里需要管理的数据是一个有序的数据序列,我们可以用最常用的vector容器来对其进行管理。而这里对数据的处理,主要是查找插入的位置和实现数据的插入,前者,我们可以用lower_bound()算法来完成,而后者,vector容器本身就带有插入这个操作,直接使用,简单省事。
废话少说,直接看STL对这个程序的减肥效果:
 

#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main()
{
  vector<int> v = {10,20,30,40,50,
  60,70,80,90,100};
 
  int n = 0;
  cout<<"Please input a number:";
  cin>>n;
   
  auto it = lower_bound(v.begin(),
  v.end(),n);
   
  v.insert(it,n);
 
  // 输出新的序列
  cout<<"the new array is: ";
  for(int i : v)
  {
  cout<<i<<'\t';
  }
 
  return 0;
}

不怕不识货,就怕货比货,通过对比,我们就可以看到STL的减肥效果有多么显著:
第一次全部在主函数中实现:69行
第二次分函数实现:93行
第三次STL实现:29行(是第一次的一半,是第二次的三分之一)

STL不仅能给程序减肥,还能为程序员省事呢。
有了容器,我们无需容器内的数据进行细部的操作,只需要调用其提供的函数,就可以完成对数据的操作(比如这里的vector的insert()函数),我们也无需自己实现算法,STL提供了常用的算法(比如,这里的lower_bound()函数),这些算法,比我们自己实现的性能更好,也更加可靠。程序员要做的,只是将容器和算法组织起来,完成业务逻辑或者更大规模的算法(比如在主函数中,用lower_bound()算法找到插入的位置,然后用容器的insert()操作完成数据的插入)。就这么简单啦

这真是一件他好我也好的事情。
所以,在这里我只能说,谁用谁知道,一般人我不告诉他!

更多《C++的十万个为什么》在 >> http://chenlq.net

------解决方案--------------------
C++ 11X 简洁了很多 
for (int & i : v) {
cout << i << '\t';
}

(int & i : v) 和 (int i : v) 不知道哪个好点