1.分类
顺序容器 | vector(向量容器) deque(双端队列容器) list(双向链表) |
关联容器 | set(单重集合) multiset(双重集合) map(单重映射表) multimap(多重映射表) |
容器适配器 | stack(栈) queue(队列) prority_queue(优先级队列) |
2.特点
类型 | 优点 | 缺点 | 适用 |
vector(动态数组) | 支持随机访问,查询效率高 | 插入、删除的效率比较低 | 对象简单,数量变化不大,随机访问频繁。 |
list(双向链表) | 任意位置删除和插入节点都是高效的 | 内存单元不连续,不支持随机访问操作 | 对象大,数量变化频繁,插入和删除频繁。 |
map(红黑树) | 支持快速的查找,通过键值可进行快速的查找 |
3.STL里sort算法用的是什么排序算法?
快速排序,还结合了插入排序和堆排序。
一般,STL中vector、queue用到sort排序
数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序。
4.STL提供哪六大组件?
1)容器是用来存放数据的各种数据结构,以类模板来实现。
2)算法是一种函数模板。算法解决问题的数据来自于容器。
3)迭代器是泛化的容器和泛化的算法中的胶着剂。迭代器是一种类模板,各容器都有自己的迭代器类模板,各容器会将其对应的迭代器作为其类型成员,因此说迭代器一般依附于容器之下。
4)仿函数又名函数对象是一种行为类似函数指针的类模板,仿函数为算法服务,一般作为算法的函数模板中的一个参数。
5)配接器,配接器可以对容器、迭代器、仿函数进行稍作加工,使之有新功能。
6)STL中的配置器与众不同,SGI使用的特殊空间配置器std::alloc.SGI STL使用2级配置器。第一级配置器配置超过128byte的调用第一级,当配置区块小的时候,调用第二级配置器,使用复扎的内存池的整理模式。
STL的优势并不在于算法,而在于内存碎片。如果你需要经常自己去new一些节点,当节点特别多,而且进行频繁的删除和插入的时候,内存碎片就会存在,而STL采用自己的Allocator分配内存,以内存池的方式来管理这些内存,会大大减少内存碎片,从而会提升系统的整体性能。
5,vector分配内存的方式
先申请一定的大小的数组, 当数组填满之后,另外申请一块原数组两倍大的新数组, 然后把原数组的数据拷贝到新数组, 最后释放原数组的大小。
6.有用的一些算法
1.最大、最小值
使用STL的Vector时,利用函数 max_element,min_element,distance可以获取Vector中最大、最小值的值和位置索引
#include <algorithm>
#include <iostream>
int main()
{
std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};
std::vector<double>::iterator biggest = std::max_element(std::begin(v), std::end(v));
//or std::vector<double>::iterator biggest = std::max_element(v.begin(), v.end);
std::cout << "Max element is " << *biggest<< " at position " <<std::distance(std::begin(v), biggest) << std::endl;
//另一方面,取最大位置也可以这样来写:
//int nPos = (int)(std::max_element(v.begin(), v.end()) - (v.begin());
//效果和采用distance(...)函数效果一致
//说明:max_element(v.begin(), v.end()) 返回的是vector<double>::iterator,
//相当于指针的位置,减去初始指针的位置结果即为最大值得索引。
auto smallest = std::min_element(std::begin(v), std::end(v));
std::cout << "min element is " << *smallest<< " at position " <<std::distance(std::begin(v), smallest) << std::endl;
}
输出:
Max element is 5 at position 4
min element is 1 at position 0
2.大小堆
push_heap()是向堆中插入一个元素,并且使堆的规则依然成立
push_heap(_RAIter,_RAIter) 默认为大顶堆
push_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
首先数组push_back插入元素,然后再调用push_heap,它会使最后一个元素插到合适位置
pop_heap()是在堆的基础上,弹出堆顶元素。
pop_heap(_RAIter,_RAIter) 默认为大顶堆
pop_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
比如pop_heap(nums.begin(), nums.end(),greater<int>()),它会将堆顶元素(即为数组第一个位置)和数组最后一个位置对调,然后你可以调用数组pop_back,删除这个元素