stl

stl中普通队列的使用(知识点记录)

喜欢而已 提交于 2020-03-17 15:38:30
stl中普通队列的使用 基本操作 头文件 声明方式 基本操作 push(x) // 将x压入队列的末端 pop() // 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值 front() // 返回第一个元素(队顶元素) back() // 返回最后被压入的元素(队尾元素) empty() // 当队列为空时,返回true size() // 返回队列的长度 头文件 #include <queue> 声明方式 普通说明 queue<int>q; 结构体说明 struct node { int x, y; }; queue<node>q; 侵删 来源: CSDN 作者: hongguoya 链接: https://blog.csdn.net/hongguoya/article/details/104903192

STL中的map容器的一点总结

守給你的承諾、 提交于 2020-03-16 08:50:48
一、关于map的介绍 map是 STL 的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。这里说下map内部数据的组织,map内部是自建一颗红黑树 ( 一种非严格意义上的平衡二叉树 ) ,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。学习map我们一定要理解什么是 一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可能轻易描述,很明显学号用int 描述,姓名用字符串描述采用 的 string,于是我们使用的map形式如下:map<int , string> student; 关于map和set底层实现以及效率问题,在另一篇 《STL中set容器的一点总结》 已经说了一些,map和set底层实现都是采用了平衡树来实现的。这里说一下map和set容器的区别。 对于map中的每个节点存储的是一对信息,包括一个键和一个值,各个节点之间的键值不能重复。 对于set中的每个节点存储的是一个信息,只有一个键,但是每个键值也是唯一的。set表示的是集合的概念。 对于map的学习,或者说是对STL中的容器的学习,要知道每种容器的实现原理,每种适合适合解决什么问题的

acm的STL容器之Map篇

半腔热情 提交于 2020-03-12 11:49:52
1.对map的简单介绍  Map是STL的一个关联容器,它提供一对一(其中第一个称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据处理能力。 这里说下map内部数据的组织,map内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。 2.map功能介绍  map利用k-v,即Key - value。key 和 value可以声明成任意你需要的类型。 查找的复杂度 基本是Log (N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。 map的常用操作: 快速插入Key -Value 记录。 快速删除记录 根据Key 修改value记录。 遍历所有记录。 3.map的声明   需要声明头文件,并使用命名空间std。 #include<iostream> #include<map> using namespace std;  声明一个map。根据个人命名规范习惯,推荐int-int类型的map叫 iimap ,如果是<int,string>类型的推荐叫 ismap 一半声明了map后,为了以后查询、遍历、删除等方便,我们顺便声明 iterator map<int,int> iimap;map<int,int>::iterator iter;   4.数据的插入、删除、数量、清空  先不写查询

STL源码剖析——容器

南笙酒味 提交于 2020-03-12 07:31:32
文章目录 一.模板特化 二.设计容器必须定义的型别 三.deque 四.心心念念的优先队列 五.hashtable的构造 一.模板特化 针对任何模板参数更进一步的条件限制所设计出来的一个特化版本,如: template < typename T > class C { . . . } ; //泛化版本,可以接受T为任何型别 template < typename T > class C < T * > { . . . } ; //特化版本,仅适合于T为原生指针时的情况 二.设计容器必须定义的型别 value_type difference_type reference_type pointer_type iterator_category: 其中设计实现了只读/只写迭代器,允许写入型,可双向移动,随机访问迭代器这5类 总结 traits编程技法(特性萃取)大量的实现大大提高了STL设计的便利性。需要注意设计正确的型别是迭代器的职责,而设计正确的迭代器则属于容器的职责。 三.deque deque与vector的差别 deque除了可以像vector那样在尾部以O(1)的时间复杂度完成插入和删除之外,还可以实现在头部以O(1)的代价插入元素 deque没有所谓的容量的概念,这个和它底层的空间组织形式有关,所以不提供reserve成员函数来限定容量

[STL]heap和priority_queue

主宰稳场 提交于 2020-03-11 21:59:22
一.heap 在STL中,priority_queue(优先权队列)的底层机制是最大堆,因此有必要先来了解一下heap。heap采用完全二叉树的结构,当然不是真正的binary tree,因为对于完全二叉树,我们通常用一个数组来表示。 以下几个算法都是STL的泛型算法,包含在头文件algorithm里,priority_queue的push(),pop()都有直接调用它们。 1.push_heap算法 首先,将新元素插入到底层vector的end()处。为了满足最大堆原理(每个结点的值必须大于或等于其子结点的值),于是将新结点与其父亲结点比较,如果其值大于父亲结点,就交换父子结点,直到不需要交换或者它已经到达根结点为止。 2.pop_heap算法 因为作为最大堆,根结点即为最大值。交换vector首尾(first和last)元素,并重新调整[first,last-1)部分,也就是将“新根结点”跟其较大子结点交换,并持续下放,知道叶子结点为止。注意,pop_heap之后,最大元素只是被放在底部容器的最尾端,并没有被取走。若要取走,可用vector的pop_back()函数。 3.sort_heap算法 持续对整个heap做pop_heap操作,每次将操作范围从后向前缩减一个元素,于是我们得到一个递增序列。显然,排序后的heap不是一个合法的heap了。 4.make_heap算法

快速排序及STL中的sort算法

浪尽此生 提交于 2020-03-11 10:39:42
   快速排序基本思想是,对待排序序列进行划分(Partition),一次划分,选择一个元素作为枢轴,然后将所有比枢轴小的元素放到枢轴的左边,将比枢轴大的元素放到枢轴的右边。然后对该枢轴划分的左右子序列分别再进行划分,如此递归。Partition是一个非常重要的概念,因为它只需要O(n)的时间复杂度就可以将待排序序列划分为两块具有大小关系的区间,可以根据这一特性求解待排序序列中最大的k个数、第k大的数等类似问题。   快速排序算法复杂度O(nlogn).   就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法,其平均时间是O(nlogn),最坏情况是O(n^2),最坏的情况就是如下倒序完后再正序排的情况。   C++代码如下: #include "stdafx.h" #define MAXSIZE 20 typedef struct{ int r[MAXSIZE+1]; int len; }SqList; int Partition(SqList &L, int low, int high) { L.r[0] = L.r[low]; // 以第一个元素作为枢轴 int pivotkey = L.r[low];// 记录枢轴关键字 while (low < high) { while(low<high && L.r[high]>=pivotkey)       --high

sort (STL)

穿精又带淫゛_ 提交于 2020-03-11 09:33:30
#include <algorithm> //仅C++ 使用方法: sort(首指针,尾指针,比较函数) 实例: 输入:   数据个数   数据 输出:   有序数列 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int Maxm = 1000 + 2; int n[Maxm]; bool cmp(int a, int b) {return a > b;} int main() { int t; scanf("%d", &t); for(int i = 0; i < t; i++) scanf("%d", &n[i]); sort(n + 1, n + t, cmp); for(int i = 0; i < t; i++) printf("%d ", n[i]); return 0; } 倒序版本(比较函数自写)  //不是很好,请见谅 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int Maxm = 1000 + 2; int n[Maxm]; int main() { int t; scanf("%d", &t); for

【STL】算法 — partial_sort

混江龙づ霸主 提交于 2020-03-11 09:27:57
partial_sort接受一个middle迭代器,使序列中的middle-first个最小元素以递增顺序排序。置于[first, middle)内。以下是測试代码: #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int a[] = {10,9,8,7,6,5,4,3,2,1,0}; vector<int> vec(a, a+11); vector<int>::iterator b = vec.begin(); vector<int>::iterator e = vec.end(); partial_sort(b, b+6, e); // 前6个最小元素排序 while (b != e) cout << *(b++) << ' '; return 0; } 执行结果: 从结果能够看出,前6个最小元素放在了前6个位置上,而剩下的元素则放于容器后面未排序。 实现partial_sort的思想是:对原始容器内区间为[first, middle)的元素运行make_heap()操作构造一个最大堆。然后拿[middle, last)中的每一个元素和first进行比較,first内的元素为堆内的最大值。假设小于该最大值,则互换元素位置,并对[first,

STL::sort函数实现

穿精又带淫゛_ 提交于 2020-03-11 09:24:11
声明:本文参考链接: STL::sort实现 。 排序是面试中经常被问及的算法基础知识点,虽然实际应用中不会直接使用,但是理解这些简单的算法知识对于更复杂更实用的算法有一定的帮助,毕竟面试总不能问的太过深入,那么这些知识点就显得很重要了。我们在程序中经常利用sort给序列排序,那么你知道它是什么实现的吗? 函数声明 #include <algorithm> template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last); template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); 来自 sort - C++ Reference 。STL提供了两种调用方式,一种是使用默认的 < 操作符比较,一种可以自定义比较函数。可是为什么它通常比我们自己写的排序要快那么多呢? 实现原理 STL中的sort不是普通的 快排 ,除了对普通的快速排序进行优化,它还结合了 插入排序 和 堆排序 。根据不同的数量级别以及不同情况,能自动选用合适的排序方法

c++ stl algorithm: std::find, std::find_if

孤者浪人 提交于 2020-03-10 22:21:12
td::find: 查找容器元素, find只能查找容器元素为<基本数据类型> [cpp] view plain copy #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v; for (int i = 0; i < 10; ++i) v.push_back(i); std::vector<int>::iterator iter = std::find(v.begin(), v.end(), 3); if (iter == v.end()) std::cout << "can not find value 3 in v" << std::endl; else std::cout << "the index of value " << (*iter) << " is " << std::distance(v.begin(), iter) << std::endl; return 0; } std::find_if 按条件查找容器元素, 容器类型为<类>时, 无法使用find来查找, 所以要使用find_if来查找 [cpp] view plain copy #include <iostream> #include <vector> #include