STL学习笔记— —无序容器(Unordered Container)

简单介绍

在头文件<unordered_set>和<unordered_map> 中定义

namespace std
{
    template <typename T,
            typename Hash = hash<T>,
            typename EqPred = equal_to<T>,
            typename Allocator = allocator<T> >
        class unordered_set;

    template <typename T,
            typename Hash = hash<T>,
            typename EqPred = equal_to<T>,
            typename Allocator = allocator<T> >
        class unordered_multiset;

    template <typename Key, typename T,
            typename Hash = hash<T>,
            typename EqPred = equal_to<T>,
            typename Allocator = allocator<pair<const Key, T> > >
        class unordered_map;

    template <typename Key, typename T,
            typename Hash = hash<T>,
            typename EqPred = equal_to<T>,
            typename Allocator = allocator<pair<const Key, T> > >
        class unordered_multimap;
}

unordered_set、unodered_multiset、unordered_map、unodered_multimap都是无序容器,都是以哈希表实现的。

unordered_set、unodered_multiset结构

unordered_map、unodered_multimap结构

Unord和multiUnord操作

构造、复制与析构

Unord c //默认构造函数;创建一个空无序容器

Unord c(bnum) //创建一个空无序容器,内部至少使用了bnum个桶

Unord c(bnum,hf) //创建一个空无序容器,内部至少使用了bnum个桶,hf作为哈希函数

Unord c(bnum,hf,cmp) //创建一个空无序容器,内部至少使用了bnum个桶,hf作为哈希函数,cmp用来识别相等的值

Unord c = c2 //复制构造函数。创建一个新的无序容器作为c2的副本(全部元素都被复制)

Unord c = c2 //复制构造函数;创建一个新的无序容器作为c2的副本(全部元素都被复制)

Unord c(rv) //移动构造函数;使用右值对象rv创建一个新无序容器

Unord c = rv //移动构造函数;使用右值对象rv创建一个新无序容器

Unord c(beg,end) //创建一个无序容器。并使用beg到end范围内的值进行初始化

Unord c(beg,end,bnum) //创建一个无序容器。并使用beg到end范围内的值初始化,内部至少使用了bnum个桶

Unord c(beg,end,bnum,hf) //创建一个无序容器。并使用beg到end范围内的值初始化。内部至少使用了bnum个桶,hf作为哈希函数

Unord c(beg,end,bnum,hf,cmp) //创建一个无序容器,并使用beg到end范围内的值初始化。内部至少使用了bnum个桶,hf作为哈希函数,cmp用来识别相等的值

Unord c(initlist) //创建一个无序容器,并使用初始化列表进行初始化

Unord c = initlist //创建一个无序容器,并使用初始化列表进行初始化

c.~Unord() //销毁全部元素并释放内存

在这里Unord可能是例如以下的一种:

unordered_set<Elem> //一个无序set,使用默认hash<>,默认比較equal_to<>

unordered_set<Elem,Hash> //一个无序set,使用Hash作为hash函数。默认比較equal_to<>

unordered_set<Elem,Hash,Cmp> //一个无序set,使用Hash作为hash函数,使用Cmp进行比較

unordered_multiset<Elem> //一个无序multiset。使用默认hash<>,默认比較equal_to<>

unordered_multiset<Elem,Hash> //一个无序multiset,使用Hash作为hash函数,默认比較equal_to<>

unordered_multiset<Elem,Hash,Cmp> //一个无序multiset。使用Hash作为hash函数。使用Cmp进行比較

unordered_map<Key,T> //一个无序map,使用默认hash<>。默认比較equal_to<>

unordered_map<Key,T,Hash> //一个无序map,使用Hash作为hash函数,默认比較equal_to<>

unordered_map<Key,T,Hash,Cmp> //一个无序map,使用Hash作为hash函数,使用Cmp进行比較

unordered_multimap<Key,T> //一个无序multimap,使用默认hash<>,默认比較equal_to<>

unordered_multimap<Key,T,Hash> //一个无序multimap,使用Hash作为hash函数。默认比較equal_to<>

unordered_multimap<Key,T,Hash,Cmp> //一个无序multimap,使用Hash作为hash函数,使用Cmp进行比較

布局操作

c.hash_function() //返回哈希函数

c.key_eq() //返回用于比較键的相等性的函数

c.bucket_count() //返回眼下桶的个数

c.max_bucket_count() //返回桶的可能的最大数目

c.load_factor() //返回眼下桶内的负载的元素数量

c.max_load_factor() //返回桶可以负载的最大元素数量

c.max_load_factor(val) //设置桶最大负责数量为val

c.rehash(bnum) //又一次生产哈希表,使桶的数目至少为bnum

c.reserve(num) //又一次生产哈希表,以至于有足够的空间存放num个元素

非变动性操作

c.empty() //推断容器是否为空,与size()==0同样。但可能更快

c.size() //返回当前元素数量

c.max_size() //返回可容纳的元素最大数量

c1 == c2 //推断c1与c2是否相等

c1 != c2 //推断c1与c2是否不相等。等同于!(c1==c2)

特殊查询操作

c.count(key) //返回键值为key的元素个数

c.find(key) //返回第一个键值为key的位置,若没找到返回end()

c.equal_range(key) //返回全部键值为key的范围。如key可以被插入的第一个位置到最后一个位置

赋值

c = c2 //将c2全部元素赋值给c

c = rv //将右值对象rv的全部元素移动赋值给c

c = initlist //使用初始化列表进行赋值

c1.swap(c2) //交换c1和c2的数

swap(c1,c2) //交换c1和c2的数

迭代器相关函数

c.begin() //返回一个前向迭代器,指向第一个元素

c.end() //返回一个前向迭代器,指向最后一个元素

c.cbegin() //返回一个前向常迭代器。指向第一个元素

c.cend() //返回一个前向常迭代器。指向最后一个元素

c.rbegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素

c.rend() //返回一个逆向迭代器。指向逆向迭代的最后一个元素

c.crbegin() //返回一个逆向常迭代器。指向逆向迭代的第一个元素

c.crend() //返回一个逆向常迭代器,指向逆向迭代的最后一个元素

插入和移除元素

c.insert(val) //插入一个val的副本,返回新元素位置(对Unord来说不论成功与否)

c.insert(pos,val) //插入一个val副本,返回新元素位置(pos应该是插入的搜寻起点)

c.insert(beg,end) //将范围beg到end的全部元素的副本插入到c(无返回值)

c.insert(initlist) //插入初始化列表的全部元素的副本(无返回值)

c.emplace(args...) //插入一个使用args初始化的元素副本,返回新元素位置(对Unord来说不论成功与否)

c.emplace_hint(pos,args...) //插入一个使用args初始化的元素副本,返回新元素位置(pos应该是插入的搜寻起点)

c.erase(val) //移除全部与val值相等的元素。并返移除的元素个数

c.erase(pos) //移除迭代器位置的元素,并返回下个元素的位置

c.erase(beg,end) //移除beg到end范围内的全部元素,并返回下个元素的位置

c.clear() //移除所以元素,清空容器

bucket接口

c.bucket_count() //返回眼下桶的个数

c.bucket(val) //返回值val会被查询到的桶的索引

c.bucket_size(buckidx) //返回buckidx桶内的元素个数

c.begin(buckidx) //返回buckidx桶内指向第一个元素的前向迭代器

c.end(buckidx) //返回buckidx桶内指向第一个元素的前向迭代器

c.cbegin(buckidx) //返回buckidx桶内指向第一个元素的前向常迭代器

c.cend(buckidx) //返回buckidx桶内指向第一个元素的前向常迭代器

把unordered_map当作关联数组使用

c[key] //返回一个指向键值为key的元素的引用。假设不存在就插入这个元素

c.at(key) //返回一个指向键值为key的元素的引用
时间: 2024-10-14 00:52:43

STL学习笔记— —无序容器(Unordered Container)的相关文章

STL学习笔记— —特殊容器queue

简介 在头文件<queue> 中定义 namespace std { template <typename T, typename Container = deque<T>> class queue; } queue就是数据结构里队列的实现,先进先出.定义中的第二个参数用来定义queue内部存放元素的实际容器,可以是任何序列式容器,默认容器为deque. 实际上queue也只是很单纯地把各项操作转化为内部容器的对应调用. 核心接口 push() //将一个元素置入que

STL学习笔记— —特殊容器priority_queue

简介 在头文件<queue> 中定义 namespace std { template <typename T, typename Container = vector<T>, typename Compare = less<typename Container::value_type>> class priority_queue; } priority_queue与queue很类似,但是priority_queue内部根据某种规则进行了排序,所以既不是先进

C++学习笔记5 容器

1.  使用assign assign 操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中.与复制容器元素的构造函数一样,如果两个容器类型相同,其元 素类型也相同,就可以使用赋值操作符(=)将一个容器赋值给另一个容器.如果在不同(或相同)类型的容器内,元素类型不相同但是相互兼容,则其赋值运 算必须使用assign 函数.例如,可通过assign 操作实现将vector 容器中一段char* 类型的元素赋给string 类型list 容器. 由于assign 操作首先删除容器中

STL学习笔记--&gt;初识STL

“这里要用char类型”; “这里要用int类型”; “其实实现这个方法只需要把另一个方法的返回值的类型和传入参数的类型改成float类型就实现了”; “其实这个算法只需要把以前写的那个稍微改动一下就行了”; ……………… 学过面向对象语言的都知道GP这个概念,就是泛型程序设计,说的再明白点就是编写不依赖于具体数据类型的程序,C++作为一门面向对象语言,当然也有泛型这个概念,这就不得不提STL(Standard Template Library,标准模板库),是被融入C++标准程序库里面的一个高

【stl学习笔记】deques

deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似.deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据.因此deque在随机访问和遍历数据会比vector慢. deque的各项操作只有以下两点与vector不同: 1.deques不提供容量操作(capacity()和re

STL学习笔记--3、迭代器iterator与traits编程

iterator模式:提供一种方法,依次巡访某个聚合物(容器)所含的各个元素,而无需暴露该聚合物的内部表达式. 1.迭代器设计思维 STL在于将数据容器和算法分开,彼此独立,最后再以一帖粘合剂将它们撮合在一起.只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作. 算法find():接受两个迭代器和一个搜寻目标. //摘自SGI<stl_algo.h> template <class InputIterator, class T> InputIterator find(Inp

STL学习笔记(序列式容器)

Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector<Elem> c1(c2) //产生另一个同型vector的副本,(所有元素都被拷贝) vector<Elem> c(n) //利用元素的default构造函数生成一个大小为n的vector vector<Elem> c(n,elem) //产生一个大小为n的vector,每个元素

STL学习笔记

这篇笔记暂时只是一部分,后续的部分会慢慢贴出来.有错误之处还望大神指教 1,容器 (1)vector vector要求<vector>的头文件包含,实际的实现是在<stl_vector.h>中. vector的初始化方式: 1,直接初始化空: vector():start(0),end(0),end_of_storage(0){}; ex: vector<int> vec; 2,初始化并赋值 vector<int/double/long/decimal/float

Dokcer学习笔记之容器管理命令

以下是对运行容器的命令的简单笔记: docker run IMAGE [COMMAND] [ARG....] run 在新容器中执行命令 -i --interactive=true|fasle 默认是false 交互模式 -t --tty=true|false 默认是false    端口 eg:    docker run -i -t centos /bin/bash 容器查看:docker ps -a|-l -a 所有容器列表 -l 刚刚运行的一个容器 ps 不加参数只列出运行的 docke