c++标准容器的简介

http://ewangplay.appspot.com/?p=5002
容器类可以分为两大类:

(1)序列容器(Sequence containers)

这种容器中的元素是有序的,每一个元素在容器中都有一个确切的位置,这个位置不依赖于元素的值,而是跟放入容器的时机有关。标准的序列容器有三个:vector, deque, list。另外你也可以把字符串(string)和数组(array)看成序列容器。
Vectors
一个vector用动态数组来管理它的元素。像普通数组一样,通过对应的索引支持随机访问。从一个vector的尾部追加和删除元素是快速高效的,而从头部和中间进行这些操作效率就会低些,因为为了维护元素的序列索引必须多做一些移动元素的操作。

下面我们看一个使用vector的简单例子:

#include
#include
using namespace std;
int main()
{
    vector col1;    //create a vector for elements of type int.

    //append six elements to the vector

    for(int i = 1; i <= 6; i++)
    {
        col1.push_back(i);
    }

    //print all the elements of the vector

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


Deques

deque表示双端队列——double-ended quene。deque同样用动态数组来管理它的元素,但和vector不同的是,deque可以同时向两个方向增长,所以在deque的头部和尾部添加元素都是快速高效的,而在中间插入元素则效率稍低,因为要移动元素。
下面我们看一个使用deque的简单例子:

#include
#include
using namespace std;
int main()
{
    deque col1;    //create a deque for elements of type float
    
    //insert six elements at the front of the deque
    for (int i = 1; i <= 6; i++)
    {
        col1.push_front(i*1.1);
    }


    //print all the elements of the deque
    for (int i = 0; i < col1.size(); i++)
    {
        cout << col1[i] << endl;
    }
    cout << endl;
}


Lists

list使用双向链表来管理它的元素。这就表示list中的元素不能随机访问,所以在list中定位一个元素要比在vector和deque中费时好多。但有利有弊,相比较与vector和deque,在list插入和删除元素的效率在任何位置都是等效的,不需要移动其他的元素,只需要维护好指针连接即可,所以非常快速高效。
下面是一个使用list的简单例子:

#include
#include

using namespace std;

int main()
{
    list col1;    //create a list for elements of type char
    
    //append a - z characters at the end of list
    for (char c = 'a'; c <= 'z'; c++)
    {
        col1.push_back(c);
    }


    //print and remove the elements
    while(!col1.empty())
    {
        cout << col1.front() << ' ';
        col1.pop_front();
    }
    cout << endl;
}

list因为不能随机访问元素,所以不支持[]操作符。

Strings

对于c++中的base_string<>, string, wstring字符串类,我们也可以视其为容器类,类似于vector,不同是它们的元素类型已经确定:char。

Arrays

c或者c++的静态数组原则上不能归类于STL容器,因为它们自己的成员函数,诸如:size(),empty()等等。然而STL的设计中却允许你针对这些普通静态数组使用STL算法。具体的使用请参看下面章节。

(2)关联容器(Associative containers)
这种容器是按值排序的,每一个元素的位置不依赖与放入容器的时机,而是根据其值而定。通常关联容器具体由二叉树(binary tree)来实现。
标准的关联容器类有四个:set, multiset, map, multimap。

Set
一个set容器中的元素是按照其自身的值排序的,而且一个值只允许出现一次。

Multisets

一个multiset容器除了允许出现相同值外,其它跟set容器一样。


Maps

一个map容器中的元素是一个key/value键值对,其中元素按照key来排序,而且不允许出现相同值得key。

Multimaps

一个multimap容器除了允许出现相同key值得元素之外,其它跟map容器一样。

所有这些关联容器类,它们缺省的排序规则是操作符<,同时你也可以通过模板参数自定义排序规则(比较函数或者函数对象)。

(3)容器适配器(Container Adapters)
除了基本的容器类外,c++标准库还提供了一些容器适配器类来满足一些特殊的需求。这些容器适配器类由基本的容器类实现。
Stacks

一个stack容器用LIFO(last-in-first-out)的策略来管理元素。

Queues

一个queue容器用FIFO(first-in-first-out)的策略来管理元素。

Priority Queues
一个priority queue容器用优先级的策略来管理元素。元素的优先级基于程序员指定的一个排序策略(缺省用操作符<)。通常容器中下一个元素就是优先级最高的元素,如果优先级最高的元素不止一个,那么它们的顺序没有定义。

 

 

 

注:

这几个标准容器类和数据结构对应关系

vector => 数组、list => 链表、deque => 队列

你可能感兴趣的:(C++)