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