![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL
独L无二
一位颇为清高的女程序媛
展开
-
哈希函数的构造和处理冲突的方法
哈希函数的构造常用的哈希函数的构造方法有 6 种:直接定址法、数字分析法、平方取中法、折叠法、除留余数法和随机数法。直接定址法:其哈希函数为一次函数,即以下两种形式:H(key)= key 或者 H(key)=a * key + b其中 H(key)表示关键字为 key 对应的哈希地址,a 和 b 都为常数。 例如有一个从 1 岁到 100 岁的人口数字统计表,如表 1 所示: 表 1 人口统计表假设其...转载 2020-08-06 14:39:22 · 1642 阅读 · 1 评论 -
C++ HashTable的简单实现
hashtable :本文中采用开链法( separate chaining )来处理 “ 冲突 ” ( collision ),而且 hashtable只存储唯一的元素,不存在重复。class hashtable {public: // 构造函数, n 为想要构造的 hashtable 的 bucket 数量 hashtable(size_t n); ~hashtable(); // 插入元素。若元素不存在,插入成功返回 true ;若元素已存在则插入失败,返回转载 2020-08-20 15:52:03 · 1086 阅读 · 0 评论 -
STL vector,list,deque区别
在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担。还有一个就是容器,你会发现要是自己写一个链表、队列,或者是数组的时候,既要花时间还要操心怎么去维护,里面的指针啊,内存够不够用啊,长度问题,有没有可能溢出啊等等一系列的问题等着我们去解决,还是比较头疼的。所以容器的出现解决了这一个问题,它将这些数据结构都封装成了一个类,只需要加上头文件,我们就可以轻松的应用,不用那么复杂,就连指针也被封装成了迭代器,用起来更方便,更人性化,方便了我们的编程,对于程序员转载 2020-08-28 12:37:47 · 200 阅读 · 0 评论 -
STL常用容器插入/删除/查找性能总结
容器名称 容器类型 插入性能 删除性能 查找性能 使用场景 vector 顺序 尾端:O(1) 非尾端P:O(N-P) 尾端:O(1) 非尾端P:O(N-P) O(1) 需要快速查找,不需要频繁插入/删除 list 顺序 O(1) O(1) O(N) 需要频繁插入/删除,不需要快速查找 forward_list 顺序 O(1) O(1)原创 2020-08-28 11:42:50 · 1896 阅读 · 0 评论 -
unorder_map的底层实现方法
哈希表哈希表是一个K_V的结构,,,,又被称为是散列表!!!!!它是根据关键字(key)来直接访问这个内存存储数据位置的数据结构;在构建哈希表的方法,我们这里主要介绍两种方法:1、直接地址法;什么意思呢?????就是直接取key(或者是某种线性函数)作为这个下表来存储数据 ,,,key在这里称作是 散列地址。。。可以理解成这个样子 Hash(Key)= Key 或Hash(Key)= A*Key + B,A、B为常数。。。。2、除留余数法;这里方法的说法是:就是..转载 2020-08-28 10:40:34 · 1557 阅读 · 0 评论 -
STL中map和set底层的红黑树实现
我们都知道map和set的实现是依赖红黑树的怎样写红黑树可以让map和set都可以使用呢?在这里我们定义了一个模版参数,如果它是key那么它就是set,如果它是map,那么它就是map;我们分析一下,红黑树迭代器的前置++到当前结点,就说明了它的左子树和自己都已经访问过了1,当前位置,若右树不为空,则访问右树的最左结点2,当前位置,若右树为空,则找祖先中孩子不是他的右若右访问完,那么父亲这棵树也就访问完了前置–的算法思想和++是近似的。比较大小时,set直接比较它的key,而map是比转载 2020-08-28 09:49:30 · 462 阅读 · 0 评论 -
STL中vector的实现及面试问题
一、前言:在学习c++的时候我们会接触两个库,一个是boost库另外一个就是STL库。关于STL库候捷先生的《STL源码剖析》中已经写的很详细了,今天我就关于STL中的vector实现及面试中的一些与之相关的问题做一个讲解。在面试C++的时候关于vector是作为基础知识经常被问到的,如果面试官问你vector的实现原理,你会怎么回答呢?二、vector的实现原理及实现机制关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(转载 2020-08-20 17:39:40 · 912 阅读 · 0 评论 -
STL中常用的算法
为了处理容器内的元素,STL提供了一些标准算法,包括查找、排序、拷贝、重新排序、修改、数值运算等基本而普遍的算法。算法并非容器内的成员函数,而是一种搭配迭代器使用的全局函数。这么做有一个重要的优势,所有算法只需要实现一份,就可以对所有容器运作,不必为每一种容器量身定做。1、非更易型算法2、更易型算法3、移除型算法4、变序型算法5、排序算法6、已排序区间算法7、数值算法1、非更易型算法 非更易型算法既不改动元素的次序,也不改动元素值。for_each() 对..转载 2020-08-20 17:53:55 · 354 阅读 · 0 评论 -
STL List简单实现
原理:list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。优点:任意位置的插入删除效率很高(双向迭代)缺点:任意位置的随机访问效率很低#pragma once#include <iostream>#include <assert.h>//原生态指针:所存储元素类型的指针 例如 vector //将原生态指针进行封装template <class T>//结点定义stru.转载 2020-08-20 18:06:13 · 353 阅读 · 0 评论 -
c++11 push_back与emplace_back之间的区别
使用empalce操作新标准中加入了三个新成员——emplace、emplace_front、emplace_back。这些是操作构造,而不是拷贝构造。这些操作分别对应以前的insert、push_front、push_back。允许我们将元素放置在一个指定位置之前或容器头部或容器尾部。当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理转载 2020-08-27 13:56:54 · 705 阅读 · 0 评论 -
为什么不要在STL容器中存储 auto_ptr 对象?
大多数C++ 程序员都知道不要把auto_ptr 对象作为STL容器元素来使用。但是很少有人知道到底是为什么。C++标准如是说:“STL元素必须具备拷贝构造和可赋值……”,其意思是说对象可以进行安全的赋值操作,可以将一个对象拷贝到另一个对象,从而获得两个独立的,逻辑上相同的拷贝。尤其是当一个对象被拷贝到目标对象后,原来的对象不会改变。但 auto_ptr 却不然,用 auto_ptr 进行赋值和拷贝操作不仅会改变目标拷贝,而且还明显地改变原来的对象。明确地说,就是原来对象将指针的物主身份转换成目标对象,与此转载 2020-08-27 11:24:32 · 353 阅读 · 0 评论 -
STL map和unordered_map区别
map在底层使用了红黑树来实现,unordered_map是C++11标准中新加入的容器,它的底层是使用hash表的形式来完成映射的功能,map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator< 定义的大小排序。而unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同。所以,对unordered_map进行遍历,结果是无序的。使原创 2020-08-26 15:50:55 · 427 阅读 · 0 评论