C++中STL相关问题

 

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,删除这个元素
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值