c++标准库——容器类

容器类可以分为两大类和容器适配器:

(1)序列容器(Sequence containers)


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

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

 

#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> 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 <iostream>
#include <deque>
using namespace std;
int main()
{
deque<float> 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 <iostream>
#include <list>

using namespace std;


int main()
{
list<char> 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容器用优先级的策略来管理元素。元素的优先级基于程序员指定的一个排序策略(缺省用操作符<)。通常容器中下一个元素就是优先级最高的元素,如果优先级最高的元素不止一个,那么它们的顺序没有定义。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值