C++ list, vector, map, set 区别与用法比较

基本理解:

list封装了链表 , vector封装了数组 , list和vector最大的区别在于vector使用了连续的内存存储的 ,支持[]  ; list是以链表的形式实现的,地址不一定连续,不支持[]。

vector 对于随机访问的速度很快 ,但是头插元素很慢(因为要搬移数据) ,尾插数据较快(用下标通过[ ]访问);

list随机访问很慢(需要遍历链表),但是对于插入就很快了(不需要搬移数据,只需改变指针指向就可以了);

vector有容量大小,使用原生指针多为迭代器,list 没有容量,迭代器是另外创建的(因为需要重载++、--之类的运算符)


map/set 是关联式容器 ,底层使用红黑树,插入和删除的效率高(不需要内存拷贝和内存移动,直接改变节点的指针就好了)


set 和vector区别:set不包含重复的数据;

set和map区别: set只有key , map有key和对应的value 

map 和hash_map 区别:hash_map使用了hash算法加快了查找的过程,但是需要更多的元素存放hash桶元素,可以理解为空间换时间。


vector

vector可以理解为动态数组(内存连续,容量可变)

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

优点:1、不指定一个内存块的大小的连续存储,可以像数组一样操作,同时也可以对数组动态操作。push_back,pop_back

  2、随机访问,支持[ ]

  3、节省空间

缺点:1、插入删除效率太低

  2、只能尾插push_back()和尾删pop_back()

  3、当size 超过capacity时,要重新分配内存、拷贝原来数据、释放原来空间


list

双向链表

每个节点都包括一个信息块Info、一个前驱指针pre、一个后继指针Post 。使用非连续的内存空间进行存储。

优点:1、使用非连续空间完成动态操作

  2、方便在插入和删除操作

  3、可以在两端push和pop

缺点:1、不能随机访问,不支持[ ]

  2、相对于vector占用内存较多( 两个指针占用内存)


deque

双端队列 ,vector和list在底层上使用deque

优点:1、随机访问,支持[ ]

  2、插入删除方便

  3、可以在两端push、pop

缺点:1、占用内存多(前后指针占用)


map

map映照容器的元素数据是一个key和value键值对


1、map创建、插入和遍历数据

创建map对象,key和value的类型由自己定义。在没有指定比较元素时,元素的插入位置是按key从小到大插入到红黑树中。

2、删除元素

map的erase()删除元素函数,可以删除某个迭代器位置上的元素,某个key的元素、一个迭代器区间的元素;

clear()清空map所有元素

3、元素的搜索

使用find()搜索某个key值,搜到了则返回迭代器的位置,否则返回end()位置

4、map默认是排序的----升序


举例:

#include <map>
#include <string>
#include <iostream>
 using std :: cout ;
 using std :: endl ;
 using std :: string ;
 using std :: map ;

int main()
{
     //定义map对象,当前没有任何元素</span>
     map<string,float> m ;
     
    //插入元素,按键值的由小到大放入黑白树中</span>
     m["Jack"] = 98.5 ;
     m["Bomi"] = 96.0 ;
     m["Kate"] = 97.5 ;
     m.erase("Jack"); //删除key为28的元素</span>
    //先前遍历元素</span>
     map<string,float> :: iterator it ;
     for(it = m.begin() ; it != m.end() ; it ++)
     {
         cout << (*it).first << " : " << (*it).second << endl ;
     } 
     return 0 ;
}


set

set是集合,set中不会包含重复元素

在默认情况下会对元素进行自动排序 , set 默认是 升序的 

在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。 









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值