C++STL容器

目录

 

容器

容器底层实现原理

vector

一 理论:

二 实际应用:

list

一 理论

二 实际应用

deque

一 理论

二 实际应用

set,map

一 理论

二 实际应用

hash_map,hash_set

一 理论

二 实际应用


容器

作为STL的最主要组成部分--容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。当然还有array,forward_list,hash_map,hash_set。

容器

特性

所在头文件

向量vector

可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比,尤其对向量头的添加和删除的代价是惊人的高的

<vector>

双端队列deque

基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度

<deque>

表list

对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间。

<list>

队列queue

插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。

<queue>

堆栈stack

堆栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则

<stack>

集合set

由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。但是它是以牺牲插入删除操作的效率为代价的

<set>

多重集合multiset

和集合基本相同,但可以支持重复元素具有快速查找能力

<set>

映射map

由{键,值}对组成的集合,以某种作用于键对上的谓词排列。具有快速查找能力

<map>

多重集合multimap

比起映射,一个键可以对应多了值。具有快速查找能力

<map>

hash_map

hash_set

底层是hash_table,插入删除O(1),占用空间大,无序。

<hash_map>

<hash_set>

array相当于标准数组的容器类型。它是一个有 N 个 T 类型元素的固定序列。除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别。显然,不能增加或删除元素。<array>

 

常用的容器

vector

一 理论:

1.扩充空间(不论多大)都应该这样做:

  1. 配置一块新空间
  2. 将旧元素一一搬往新址
  3. 把原来的空间释放还给系统

2.vector 的数据安排以及操作方式,与array 非常相似。两者的唯一差别在于空间的利用的灵活性。Array 的扩充空间要程序员自己来写。

二 实际应用:

1.数据成员:

Protected:

Iterator start; //表示目前使用空间的头

Iterator finish; //表示目前使用空间的尾

Iterator end_of_storage; //表示目前可用空间的尾

注意这几个数据成员在外部不可以使用,他们是protected , 所以只能通过函数得到他们

Public:

Iterator //vector 的迭代器(是普通指针)

2.成员函数:

Public:

Iterator begin(); //返回start

Iterator end(); //返回 finish

Reference front(); //返回首元素的引用

Reference back(); //返回尾元素的引用

 

Size_type size(); //返回使用空间的大小,finish-start

Size_type capacity(); //返回容量的大小,end_of_storage-start

Void push_back(const T& x); //将元素插入到最尾端

(注意当用push_back 向vector 尾部加元素的时候,如果当前的空间不足,vector 会重新申请空间,这次申请的空间是原来的空间大小的1.5倍,也就是新的可用空间将增加为原来的1.5倍)

Void pop_back(); //将最尾端的元素取出

注意当用pop_back 删除尾部的元素时,vector 的capacity 是不会变化的

Iterator erase(iterator position) //清除某位置上的元素,vector的使用空间会减少

Void insert(插入的位置,插入的数值) //在某个位置才插入多少个元素,vector 的使用空间会增加

Void clear() //清除所有元素,vector 的使用空间减为零,可用空间不变

list

一 理论

STL list 是一个双向链表,迭代器具备前移和后移的能力。list 有一个重要的性质:插入操作和结合操作会造成原有的迭代器失效。应用时应该用<list>

二 实际应用

1.与vector相同的操作:

List<int> list;

Ilist.push_back(0);

Ilist.begin();

Ilist.end();

Ilist.insert();

Ilist.erase();

Ilist.clear();

2.特有的操作

(1)Void push_front(const T &x); //插入一个结点,作为头结点

(2)Void push_back(const T &x); //插入一个结点,作为尾结点

(3)Void pop_front(); //移除头结点

(4)Void pop_back(); //移除尾结点

(5)Void remove(const T&value); //将数值为value的所有元素移除

(6)Void unique(); //将“连续而相同的元素”移除只剩一个

(7)Void splice(iterator position, list &x); //将x 结合于position所指位置之前。X 必须不同于*this

(8)Void splice(iterator position, list&, iterator i); //将i所指的元素结合于position所指位置之前。Position 和 i 可指向同一个list

(9)Void splice(iterator position, list&, iterator first, iterator lsat); //将[first, last)内的所有元素结合于 position 所指的位置之前,position和[first, last)可指向同一个list,但是position 不能位于[first, last)之内。

(10)void merge(list& x); //将x合并到*this 身上。两个lists 的内容都必须先经过递增排序。

(11)void reverse(); //将*this 的内容逆向重置

(12)void sort(); //将list 的元素进行升序排序

deque

一 理论

1.Deque 是一种双向开口的连续性空间。可以在头尾两端分别做元素的插入和删除操作。Vector 从技术观点也可以在头尾两端进行插入和删除操作,但是其头部操作的效率很低。

2.deque 没有容量的观念。它是动态以分段连续空间组合而成,随时可以增加一块更大的空间,然后复制元素。

3.deque 的迭代器不是普通的指针,其复杂度比vector 复杂的多。除非必要,我们应该尽量选择使用vector 而非 deque。

4.deque 由一段一段的定量连续空间构成。一旦有必要在deque 的前端和尾端增加新空间,便配置一段定量连续空间,串接在整个deque 的头端或尾端。

5.可以使用下标的操作

6.应用时应该加<deque>

二 实际应用

deque 的其他操作基本同vector

  1. push_back();
  2. push_front();
  3. pop_back();
  4. pop_front();
  5. clear();
  6. erase();
  7. insert();
  8. resize(); //重新设置deque的长度大小

set,map

一 理论

  1. Map 的特性是,所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。Pair的第一元素被视为键值,第二元素被视为实值。Map 不允许两个元素拥有相同的键值。
  2. map 的键值关系到map的元素的排列规则,任意改变map元素键值将严重破坏map的组织。所以不可以通过map 的迭代器来改变map 的键值。但是可以通过迭代器来修改元素的实值。
  3. Set的特性是,所有元素都会根据元素的键值自动被排序,Set 的元素不像Map那样可以同时拥有实值和键值,Set 元素的键值就是实值,实值就是键值。Set 不允许两个元素有相同的键值。
  4. 因为Set 元素值就是其键值,关系到 Set 元素的排列规则。如果任意改变Set 的元素值,会严重的破坏Set组织。

二 实际应用

map:

1.使用map 时首先包括头文件: #include<map>

2.使用时应该加上宏:#pragma warning (disable:4786) 来去除警告

3.构造函数:

Map<string,int> simap; //第一个参数是键值、第二个参数是实值

4. iterator find(键值); //它是map 的成员函数,用来找指定键值map的迭代器

5.pair<string,int> pairTemp(string(A),5); //pair的构造函数

6.iterator insert(iterator position, pairTemp); //将pairTemp 插入到map 中

7.void erase(iterator position); //删除指定位置上的 map 元素

8.size_type count(键值); //判断该键值的Map 元素是否存在

9.size_type size(); //返回map 中的元素的个数

10.iterator lower_bound(键值);   //返回该键值或者大于该键值的map 的迭代器

11.iterator upper_bound的(键值); //返回大于该键值的map 的迭代器

set:

1.初始化可以定义一个数组,将数组直接赋值给Set的元素。这时把数组中的重复元素删除。

Int a[5]={1,2,3,4,5};

Set<int> iset(a,a + 5);

2..insert(要插入的值);

3.erase(要删除的值);

4.find(要查找的值);

5.count(要数的值); //返回该值的数值

6.clear();

7.lower_bound();

8.upper_bound();

一些底层实现

参考:https://blog.csdn.net/daaikuaichuan/article/details/80717222

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值