C++ 容器

转自:http://blog.csdn.net/cytbox/archive/2005/01/18/258591.aspx

“从程序员的角度来看,STL是有一些可适应不同需求的群集类别(collection classes),和一些能够在这些数据群集上运行的算法构成。”

“当然,如此灵活性并非免费午餐,代价总是有的。首要的一点是,STL并不好懂。”(这是一场持久仗啊)

“若干精心勾画的组件共同合作,构筑起STL的基础。这些组件中最关键的是容器、迭代器和算法。”

“容器 Container,用来管理某类对象的集合。”

“迭代器Iterators,用来在一个对象群集的元素上进心遍历动作。”

“算法 Algorithms,用来处理群集内的元素。”

“STL的基本观念就是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。”

在标准库中,容器分为:序列式容器、关联式容器。

序列式容器:可序群集,其中每个元素均有固定位置—取决于插入时机和地点,和元素无关。如果以追加的方式对一个群集置入六个元素,它们的排列次序和置入次序一致。有几个已定义好的容器:vector、deque、list。

关联式容器:以序容器。元素位置取决于特定的排序准则。如果将六个元素的置入这个群集中,它们的位置取决于元素值,和插入次序无关。也就是说,关联式容器可以自动排序。STL提供了四个关联式容器:set、multiset、map、multimap。

//stl/vector1.cpp

#include<isotream>

#include<vector>

using namespace std;

int main()

{

   Vector<int>coll;

   //append elements with values 1 to 6

   for(int i=1;i<=6;++i)

          coll.push_back(i);

   //frint all elements followed by a space

   for(int i=0;i<coll.size();++i)

          cout<<coll[i]<<’’;

   cout<<endl;

}

这是一段利用vector的函数,将6个元素插入到vector中的代码。一边输入这些代码,一边感叹STL的强大。想想当初学数据结构时那些算法,当然STL的功能绝不是这么简单的。代码重用性得到了很大的提高。

需要注意的是,STL只提供时间效能良好的成员函数,时间效能良好通常意味具有常数复杂度或者对数复杂度。

简单说说关联式容器。

Sets:set内的元素依据其值自动排序,每个元素只允许出现一次,不允许重复。

Multisets:和set相同,只不过它允许重复元素。

Maps:它的元素都是“实值/键值”所形成的一对数。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。

Multismaps:和map相同,但允许重复元素。

容器配接器:

除了以上数个根本的容器类别,为满足特殊需求,C++标准程序库还提供了一些特别的(并且预先定义好的)容器配接器,根据基本容器类别实作而成。包括:Stacks(LIFO)、Queues(FIFO)、Priority Queue。

一个容器的简单示例:

#include <iostream>
#include
<vector>

using namespace std;
using std::vector;

int main()
{
int a[] = {1,3,5,7,9};
vector
<int> buff(a,a+5);
buff.push_back(
11);

unsigned
int i;
for(i = 0;i < buff.size();++i)
{
cout
<<buff[i]<<endl;
}

return 0;
}

posted @ 2011-05-16 08:34  hnrainll  阅读(757)  评论(0编辑  收藏  举报