STL容器及适配器

STL容器

 

1.序列式容器

: vector,deque,list

每个元素都有固定的位置(取决于插入的时机和位置,与元素值无关)。

vector

特点:

将一个元素置于一个动态数组中加以管理,可以随机存取元素。在数组尾部添加或删除元素非常快速,但是在中部或头部插入或删除元素比较耗时。

deque

“double-ended queue” 双端队列,可以随机存取。数组尾部或头部添加或删除元素非常快速,但在中部插入或删除元素比较费时。实际上,deque
是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。

list

双向链表,不提供随机存取(按顺序存储),在任何位置插入或删除动作都非常迅速。只能顺序访问(从前向后或者从后向前)。与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标预算符:operator[]。

vector

向量 相当于一个数组

在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。

优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组

进行动态操作。通常体现在push_back() pop_back()

(2) 随机访问方便,即支持[ ]操作符和vector.at()

(3) 节省空间。

缺点:(1) 在内部进行插入删除操作效率低。

(2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。

(3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放 。

操作:

1插入和删除操作push_back,pop_back(只能在数组尾部进行),删除特定位置元素erase;

2返回固定位置的元素at(int n),支持【】操作,头和尾元素front,back;

3返回头或尾的指针用begin,end;

4其他:size,swap,empty;

list

双向链表

每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。

优点:(1) 不使用连续内存完成动态操作。

(2)
在内部方便的进行插入和删除操作

(3) 可在两端进行push、pop

缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()

(2) 相对于verctor占用内存多

操作:

函数名    说明

assign()    给list赋值back()   返回最后一个元素begin()    返回指向第一个元素的迭代器

clear() 
empty()  erase() 删除一个元素 remove()从list删除元素

remove_if()     按指定条件删除元素

front()     返回第一个元素  end()       返回末尾的迭代器

insert()     插入一个元素到list中pop_back()       删除最后一个元素

pop_front()     删除第一个元素push_back()       在list的末尾添加一个元素

push_front()    在list的头部添加一个元素

reverse()  把list的元素倒转

size()       返回list中的元素个数

sort()       给list排序

splice()     合并两个list,源list的内容部分或全部元素删除,拼插入到目的list

swap()     交换两个list

unique()   删除list中重复的元素

deque

双端队列 double-end queue

deque是在功能上合并了vector和list。

优点:(1) 随机访问方便,即支持[
]操作符和vector.at()

(2)
在内部方便的进行插入和删除操作

(3) 可在两端进行push、pop

缺点:(1) 占用内存多

操作:

pop_back() 删除尾部的元素pop_front() 删除头部的元素

push_back() 在尾部加入一个元素push_front() 在头部加入一个元素

其他vector有的他也有。(与vector区别就是他多一个头部插入和删除的功能)

使用区别:

1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list

3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

2.关联式容器

:set,multiset,
map, multimap

元素位置取决于特定的排序准则,与插入顺序无关。

关联容器和顺序容器的本质区别:

关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。

都支持find、count、insert、erase操作。

Sets/Multisets:

内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找;

操作:

Maps/Multimaps:

Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现(实际上基于红黑树(RB-tree)实现),便于查找;

map就是一个容器,里面装的就是若干个pair。每个pair的第一个元素,称为键(注意键的类型必须支持小于(<)操作),第二个元素,称为值。对于普通的map,每个键都对应一个值。这样的看起来,键类似于数组的下标,而值类似于数组的值。

 

 



 

STL容器适配器

:栈stack 、队列queue 和优先级priority_queue

 

适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用

另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保

存所有元素”。(不能由迭代器访问元素或者数组下表访问元素)

*STL 中提供的三种适配器可以由某一种顺序容器去实现。默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现。由于适配器的特点,一个适配器不是可以由任一个顺序容器都可以实现的。栈stack 的特点是后进先出,所以它关联的基本容器可以是任意一种顺序容器,因为这些容器类型结构都可以提供栈的操作有求,它们都提供了push_back 、pop_back
和back 操作。队列queue
的特点是先进先出,适配器要求其关联的基础容器必须提供pop_front 操作,因此其不能建立在vector 容器上。

//插入和删除push,pop(注意区分不同数据结构此操作区别)无insert操作。

//均有清空及返回数据个数的操作,无erase操作;

//返回顶或头、尾,用top,(front,back)》》不能由迭代器访问元素或者数组下标访问元素

1 Stacks(堆栈)

C++ Stack(堆栈)是一个容器类的改编,为程序员提供了堆栈的全部功能,—

—也就是说实现了一个先进后出(FILO)的数据结构。

1.empty() 堆栈为空则返回真

2.pop() 移除栈顶元素

3.push() 在栈顶增加元素

4.size() 返回栈中元素数目

5.top() 返回栈顶元素

2 C++ Queues(队列)

C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

1.back() 返回一个引用,指向最后一个元素

2.empty() 如果队列空则返回真

3.front() 返回第一个元素

4.pop() 删除第一个元素

5.push() 在末尾加入一个元素

6.size() 返回队列中元素的个数

3 Priority Queues(优先队列)

C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有

序。

1.empty() 如果优先队列为空,则返回真

2.pop() 删除第一个元素

3.push()
加入一个元素

4.size() 返回优先队列中拥有的元素的个数

5.top() 返回优先队列中有最高优先级的元素

//定义结构,使用运算符重载,自定义优先级1

//定义结构,使用运算符重载,自定义优先级1

#include<queue>

#include<vector>

struct cmp1{

bool operator
()(int &a,int &b){

return
a>b;//最小值优先

}

};

struct cmp2{

bool operator
()(int &a,int &b){

return
a<b;//最大值优先

}

};

priority_queue<int>que;//采用默认优先级构造队列

priority_queue<int,vector<int>,cmp1>que1;//最小值优先

priority_queue<int,vector<int>,cmp2>que2;//最大值优先

 

时间: 2024-08-13 15:48:27

STL容器及适配器的相关文章

STL之stack适配器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter),我们就想到了早期用电话线上网所用的调制解调器,俗称"猫","猫"的作用是实现数模转化和模数转化,在客户端,它可以将电话的模拟信息转化为我们计算机能够接收的数字信息,所以猫相当于一个转换器.再举个更加好理解的例子来说明"适配器"的含义.相信在我们每个人的家里都有插排,假设就这么一种情况,现在我们家里的墙壁上只有一个三角的插口,而我们的电视却是两个口,怎么办?毫无疑问

STL 容器

标准库为相关对象的存储集合提供了各种类型安全容器.容器是类模板:在声明容器变量时,你可以指定该容器将保存的元素类型.可以使用初始值设定项列表构造容器.它们具有用于添加和移除元素以及执行其他操作的成员函数.可使用迭代器循环访问容器中的元素以及访问单个元素.可以通过使用其成员函数和运算符以及全局函数来显式使用迭代器.还可以隐式使用它们,例如通过使用范围 for 循环.所有 STL 容器的迭代器都有一个通用接口,但是每个容器会定义自己的专用迭代器. 容器可以分为三个类别:序列容器.关联容器和容器适配器

STL 容器的概念

STL 容器的概念 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要. 经典的数据结构数量有限,但是我们常常重复着一些为了实现向量.链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在 细节上有所出入.STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对 最常用的数据结构提供了支持,这些模板的参数允许我们

Sword STL容器分类介绍

标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.slist是一个单向链表,rope本质上是一个重型字符串 非标准关联容器hash_set.hash_multiset.hash_map和hash_multimap. 标准STL容器提供了四种不同的迭代器:iterator. const_iterator.reverse_iterator和const_reverse_i

6.5-数据结构&amp;算法-标准模板STL/STL容器/向量

一.标准模板库(STL) 1.定义了一系列的容器模板,实现泛型化的数据结构. 1)向量(vector),内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高. 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高. 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效率都比较高. 以上三种合称为线性容器. 4)堆栈(stack),后进先出 5)队列(queue),先进先出 6)优先队列(priorit

ACM常用STL容器

1 // STL(标准模板库),由三大部分组成:容器,算法,迭代器 2 3 4 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) 5 // function object(仿函数),adaptor(适配器),allocator(空间适配器) 6 7 // STL容器 8 9 // vector 10 // deque(双端数组) 11 // stack 12 // queue 13 // list(链表模型) 14 // priotry_qu

STL容器简介

C++标准定义了一系列的容器的共通要求,适用于所有的STL容器,然而由于C++11带来了容器的多样化,因此可能出现若干例外. ?初始化: 每个容器都提供了一个default构造函数,一个copy函数和一个析构函数 ? ? ?

STL容器之一vector

STL中最简单也是最有用的容器之一是vector<T>类模板,称为向量容器,是序列类型容器中的一种. 容器容量可以选择性修改.(1)声明:vector<type>  v;    //容量为0构造v对象,指定元素类型为typevector<type>  v(n);    //容量为n构造v对象,指定元素类型为typevector<type>  v(n, initValue);    //容量为n构造v对象,指定元素类型为type,且所有元素被初始化为initV

stl仿函数和适配器

所谓的适配器就是底层利用仿函数,然后修改仿函数的接口,达到自己的目的: 例如:template<class operation> class binder1st的适配器,其本质是一个类,它的模板参数operation其实是仿函数类(仿函数其实是struct类),内部函数调用operator()(const typename Operation::second_argument_type& x) const,其中x是我们适配器调用的参数,由于此适配器的目的就是绑定第一个参数,使得我们的调