哈希表
- 哈希表在使用层面上可以理解为一种集合结构
- 如果只有key,没有value,可以使用UnOrderedSet结构
- 如果既有key,又有value,可以使用UNOrderedMap结构
- 有无伴随数据是两者的唯一区别,底层实际结构是一回事。
- 使用哈希表增删改查的操作可以认为是时间复杂度O(1),但是常数时间比较大
- 放入哈希表的东西,如果是基础类型,内部按值传递,内存占用就是这个东西的大小。
- 如果不是基础类型,内部按引用传递,内存占用就是这个东西内存地址大小
哈希表的使用unorderMap
- 头文件
#include <unordered_map>
- 定义一个哈希表key和value都是int变量
unordered_map<int,int>Hash;
- 创建哈希表
Hash[1]=3;
Hash.insert<make_pair(1,3)>;
Hash.insert({1,3},{2,4});
- 迭代器
unordered_map<int,int>::iterator it;
- 迭代器访问变量
it->first;
it->second;
- 查找
it=Hash.find(1);
若找不到,返回的是Hash.end()
7. 修改
Hash[1]=4;
- 清除
Hash.erase(1);
Hash.clear();
哈希表的使用unOrderSet
- 头文件
#include<unordered_set>
- 定义
unordered_set<int>myset;
- 增加
myset.insert(3);
- 删除
myset.earse(3);
- 查找
myset.find(3);
有序表
- 有序表在使用层面上可以理解为一种集合结构。
- 如果只有key,没有伴随数据value,可以使用set结构
- 如果既有key,又有伴随数据value,可以使用map结构
- 有无伴随数据是set与map的唯一区别,底层的实际结构是一回事。
- 有序表和哈希表的区别是,有序表把key按顺序组织起来,而哈希表完全不组织。
- 只要是有序表,他的常见操作的时间复杂度都是O(logN)
有序表map的用法
- 头文件
#include<map>
- 定义
map<string,int>dict;
- 插入
dict.insert(pair<string,int>("apple",2));
dict.insert(map<string,int>::value_type("orange",3));
dict.insert(make_pair("banana",4));
dict["banana"]=6;
- 是否为空
dict.empty();
- 查找
dict.find("banana");
返回一个迭代器指向键值为key的元素,如果没找到就返回end()
- 删除
dict.earse("banana")
- 规模
dict.size()