走近 STL

2016-01-29 12:29 12 1 收藏

走近 STL,走近 STL

【 tulaoshi.com - C语言心得技巧 】

走近 STL

作者:陶汉军
中国石油大学 计算机02-2

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载源代码

  本文面向的读者:学习过C++程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者。这实际上是我学习STL的一篇笔记,老鸟就不用看了。

什么是泛型程序设计
  我们可以简单的理解为:使用模板的程序设计就是泛型程序设计。就像我们我们可以简单的理解面向对象程序设计就是使用虚函数的程序设计一样。

STL是什么
  作为一个C++程序设计者,STL是一种不可忽视的技术。Sandard Template Library (STL):
标准模板库,更准确的说是 C++ 程序设计语言标准模板库。学习过MFC的人知道,MFC是微软公司创建的 C++ 类库。而与之类似的是 STL 是模板库,只不过 STL 是 ANSI/ISO 标准的一部分,而 MFC 只不过是微软的一个产品而已。也就是说STL是所有C++编译器和所有操作系统平台都支持的一种库,说它是一种库是因为,虽然STL是一种标准,也就是说对所有的编译器来说,提供给C++程序设计者的接口都是一样的。也就是说同一段STL代码在不同编译器和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的。 令人兴奋的是,STL的使用者并不需要了解它的底层实现。 试想一下,如果我们有一把能打开所有锁的钥匙,那将是多么令人疯狂啊。嘎嘎。这个歪梦我做了20多年鸟。
  STL的目的是标准化组件,这样你就不用重新开发它们了。你可以仅仅使用这些现成的组件。STL现在是C++的一部分,因此不用额外安装什么。它被内建在你的编译器之内。

为什么我们需要学习STL

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)STL是 C++的ANSI/ISO 标准的一部分,可以用于所有C++语言编译器和所有平台(Windows/Unix/Linux..)。STL的同一版本在任意硬件配置下都是可用的;STL 提供了大量的可复用软件组织。例如,程序员再也不用自己设计排序,搜索算法了,这些都已经是STL的一部分了。嘎嘎,有意思吧;使用STL 的应用程序保证了得到的实现在处理速度和内存利用方面都是高效的,因为STL设计者们已经为我们考虑好了;使用STL编写的代码更容易修改和阅读,这是当然的鸟。因为代码更短了,很多基础工作代码已经被组件化了;使用简单,虽然内部实现很复杂;

  虽然,STL的优点甚多,但是STL的语法实在令初学者人头疼,许多人望而却步。可是STL是每个C++程序设计者迟早都要啃的一块骨头。因为越来越多的C++代码是用STL编写的,看不懂麻烦就大鸟。越来越多的人在用STL,不懂就无法和别人一起合作了。好事多磨嘛,早点学习早点解脱。

下面让我们来看几段代码吧:(你觉得头疼就不要看了)

//stl_cpp_1.cpp#include <iostreamdouble mean(double *array, size_t n){    double m=0;    for(size_t i=0; i<n; ++i){        m += array[i];    }    return m/n;}int main(void){    double a[] = {1, 2, 3, 4, 5};    std::cout<<mean(a, 5)<<std::endl;    // will print 3    return 0;}
好懂吧,除了那个std有点让人不舒服以外?这是一段普通的没有使用STL的C++代码。再看下面一段:
//stl_cpp_2.cpp#include <vector#include <iostreamint main(void){    std::vector<double a;    std::vector<double::const_iterator i;    a.push_back(1);    a.push_back(2);    a.push_back(3);    a.push_back(4);    a.push_back(5);    for(i=a.begin(); i!=a.end(); ++i){        std::cout<<(*i)<<std::endl;    }    return 0;}
  如果你真的没有接触过STL的话,你会问,呀,vector 是啥呀?我会告诉你,那是一排美女。嘎嘎。这可不是个比喻,表想歪鸟。这是一段纯种的STL代码,看到尖括号了吧,知道那是模板了吧。看到a.push_back(5),a.begin(),a.end()你不感觉奇怪么?可是我们并没有定义这些函数啊。
//stl_cpp_3.cpp#include <vector#include <iostreamint main(void){    std::vector<int q;    q.push_back(10);    q.push_back(11);     q.push_back(12);    std::vector<int v;    for(int i=0; i<5; ++i){        v.push_back(i);    }    std::vector<int::iterator it = v.begin() + 1;    it = v.insert(it, 33);    v.insert(it, q.begin(), q.end());    it = v.begin() + 3;    v.insert(it, 3, -1);    it = v.begin() + 4;    v.erase(it);    it = v.begin() + 1;    v.erase(it, it + 4);    v.clear();    return 0;}
  这一段你又看到了新东西了吧,iterator???不罗嗦了,等你看完这篇文章,回头再看就简单了。在正式介绍STL之前,我们需要花点时间来了解

来源:http://www.tulaoshi.com/n/20160129/1486306.html

延伸阅读
标签: windows 操作系统
NAP的英文全称是Network Access Protection,也就是网络接入防护,它是内置于Windows Longhorn Server以及Windows Vista客户端操作系统的安全机制。比较熟悉服务器操作系统Windows Server 2003的朋友应该对网络接入隔离控制(Network Access Quarantine Control)有所了解,NAP正是此项功能的扩展。 自Windows Vista操作系统发布以来,有...
C++ Q&A 专栏... 原著:Paul DiLascia 翻译:James Liu 原文出处:MSDN Magazine Aug 2004 (C++ Q&A) 原代码下载: CQA0408.exe (234KB) GetKeyState 使用示例 STL 字符串类与 UNICODE 如何向C#或.NET框架暴露 C++ 对象? 如何获取专用文件夹的路径名? ...
标签: 摄影
和模特出外约拍,作品却都僵硬死板如木头?拍出来没有情绪,没有感觉? 也许只是你与你的模特还不够接近 本文将展示一位摄影师的拍摄心得,与你分享走近被摄者内心的要领~。 再走近一点就好 Robert Capa 说过如果你的照片没有拍得很棒,那代表你还可以走得更近去拍摄(If your photographs aren’t good enough, you’re not clo...
标签: 分娩 孕前
生双胞胎的女性老得快 从优生优育和提高人口素质的角度来考虑,世界性的多胞胎出生率上升并不是一件值得庆贺的事。因为多胞胎既不利于优生优育,也不利于婴儿以后的成长发育。多胞胎对孕妇来说负担过重,有限“资源”难以合理分配,这些问题会直接影响到孕妇的安全。 多胞胎婴儿多数早产,发育先天不足 人类的子宫腔是有限的,胎盘的容积...
标签: 心理健康
 随着社会文明的不断提升,人们对幸福感和心理健康有了更高的要求,对心理方面的追求也越来越高。心理健康,这项在以前很长一段时间被人类所忽视的重要指标,如今正受到前所未有的重视。那么,什么是心理健康呢? 我们首先应从健康的定义说起。世界卫生组织指出:健康不仅是指没有疾病和不虚弱,而且是身体的、精神的健康和社会适应良好...

经验教程

862

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部