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;
}