STL常见问题

STL常见问题

  • Map 与unordermap

如果需要元素内部自动排序,使用map,否则使用unordermap
在实现方式上面,map使用的是红黑树,unordermap使用的是哈希表
在时间复杂度上面
map
插入 O(logn)
查看 O(logn)
删除 O(logn)

Unordermap
插入 O(1),最坏为O(n)
查看 O(1),最坏为O(n)
删除 O(1),最坏为O(n)

  • map与multimap

Map不允许两个元素有相同的键值,而multiMap可以。具体的,其内部都是使用的红黑树,在RB树内,有两个方法:insert_unique及insert_equal,即map与multimap使用的函数。在insert_unique里面会有个key_compare操作,所以不允许键值重复。

  • Erase与remove之间的区别

Remove将元素移动到容器的后面,迭代器依旧可以访问,但是erase是真正的删除元素

  • Vector与list之间的区别

Vector支持随机读取,但是插入及删除操作为O(N)
list的底层使用的是双向链表,访问数据的时间复杂度为O(n)
所以需要高效的随机读取,使用vector
需要大量的删除与插入,使用list

  • Vector的内存分配与释放

如果vector内存不够,内存会成倍的增长。其中涉及capacity,容量,size:大小。其中capacity是数组中可以容纳元素的个数,size是当前数组中存在的元素个数。
释放使用erase与clear,实际上只是size减少,但是capacity不会减少,需要swap来释放内存。
注意在vector的erase之后,迭代器可能会失效,可以使用:

Iter = v1.erase(Iter)

在map中删除元素中erase是没有返回值的

for(map<int,int>::iterator it = m.begin(); it != m.end();)
{
  if(...)  
      m.erase(it++); //在删除之前it已经递增
  else  
      ++it;
}

map释放空间使用clear来做?也用swap,这点需要去确认

  • 指针与迭代器区别

指针可以指向函数,而迭代器只能指向容器
迭代器返回的是对象的引用不是对象的值
迭代器是一个类模板
迭代器+n,-n会得到一个新的迭代器,位置在原来迭代器后面或者前面的几个位置
迭代器相减,计算两个迭代器之间的距离

  • 线程安全性

STL的对象在多线程情况下,读安全,写是不安全的
如果是shared_ptr封装的呢?
调用不同的shared_ptr实例是可以的,即使他们有同一个对象。但是多个线程读写同一个shared_ptr线程是不安全的,需要加锁
参考:https://www.cnblogs.com/gqtcgq/p/7492772.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值