随笔 - 46  文章 - 39  trackbacks - 0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用链接

留言簿(2)

随笔分类

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜


标准模板库(STL)简介

STL是一个包含类,算法和迭代器的C++库;它提供许多计算机科学的基本算法和数据结构。STL是一个基本库,意味着它的组成有大量的参数:基本上每个组成部分都是一个模板。在你使用STL之前要弄清楚模板是怎么工作的。

容器和算法

就像许多其他类库一样,STL库也包含容器类:这些类的意图是用来容纳其他对象。STL包含Vector(矢量,向量)类,list(清单),deque(队列),set(集),multiset(多重集),map,multimap,hash_set(哈希集),hash_multiset(哈希多重集),hash_map和hash_multimap。所有这些类都是一个模板,它可以实例化来容纳任何类型的对象。举个例子,你可以用vector<int>来代替普通的C数组,而且vector不用管理分配动态内存。

    vector<int> v(3);         //声明一个包含3个元素的vector。
    v[0] = 7;
    v[1] = v[0] + 3;
    v[2] = v[0] + v[1];       //v[0] == 7, v[1] == 10, v[2] == 17

STL也包含了很多算法用来操作容器中的数据。你可以使一个vetor中的元素逆向排列,举个使用reverse算法的例子。
   
 reverse(v.begin(), v.end());   // v[0] == 17, v[1] == 10, v[2] == 7

调用这个reverse函数需要注意两个要点。第一,它不是成员函数,而是一个全局函数。第二,它需要两个参数而不是一个:它不是作用在容器上,而是作用在一系列元素上。在这个具体的例子一系列元素就是整个容器v。

这些事实的原理都是一样的:reverse,像其他STL算法,都是与STL容器类分离的。这意味着reverse不仅仅只能用在vector中的元素,还可以用在lists中的元素,甚至是C数组中的元素。下面的程序是正确的。
 
  double A[6] = {1.2, 1.3, 1.4, 1.5, 1.6, 1.7};
   reverse(A, A + 6);
   for(int i=0; i<6; ++i)
     cout << "A[" << i << "]=" << A[i];

这个例子用了一个范围,就像逆序一个vector的例子:reverse的第一个参数指向这个范围的开始,第二个参数指向这个范围的末尾的后面。这个范围是[A, A+6);这两个不对称的记号让人想到两个不一样的端点,第一个是这个范围的开始,第二个是这个范围末端的后一位。


下一节《迭代器》
posted on 2012-02-20 21:02 canaan 阅读(446) 评论(0)  编辑 收藏 引用 所属分类: 外文翻译

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理