C++ 数据结构
容器类 :
std::vector()
map 的内部结构是R-B-tree来实现的 map: 内部实现红黑树 有序性,红黑树自动排序
unordered_map 在C++11的时候被引入标准库 哈希表 HashMap 散列表
skip-list跳表
#include<unordered_map>
std::unnordered_map<std::string, int> myMap;
初始化
列表初始化 另一个容器进行初始化 迭代器初始化
方法: insert() erase() find() size()
定义哈希函数对象
等于函数
比较函数 定义hash函数以及定义比较函数--operator()
Map 红黑树Map
存储的结构以及构造函数
unordered_set就是在哈希表插入value,而这个value就是它自己的key
数据量 内存使用 查找速度
hashmap
在unordered_map中存储自定义对象--确保自定义对象可以被哈希以及重载相应的比较运算符
类中重载了==符号,就不需要指定Equal函数:
类比较--
Functor Funciton Lambda
1.重载操作符
<
方法2:自定义比较函数
bool compare()
3.比较仿函数 Function Obj 可以被()调用
相当于一个类对象,通常使用它的时候要求重载一个运算符 —— 括号运算符【operator()】
bool operator()()
重载函数调用运算符 operator() 来实现仿函数 来实现自定义比较
4.std::function<>
原因:
unordered_map 的构造函数
示例:
std::unordered_map<MyClass, int, MyClassHash, MyClassEqual> _mymap;
MyClassHash 是一个结构体,它重载了operator()来为Key类型生成一个哈希值,
而 MyClassEqual 同样是一个结构体,重载了operator()来比较两个Key对象是否相等。
unordered_map的模板参数中指定了这两个对象类型作为哈希函数和等价性函数。
std::pair<const _Key,_Tp>
<key,T> 前 2 个参数分别用于确定键值对中键和值的类型,也就是存储键值对的类型
默认使用 STL 标准库提供的 hash<key> 哈希函数。
注意,默认哈希函数只适用于基本数据类型(包括 string 类型),而不适用于自定义的结构体或者类。
默认情况下,使用 STL 标准库中提供的 equal_to<key> 规则,该规则仅支持可直接用 == 运算符做比较的数据类型
使用:
1.使用it->first和it->second分别访问键和值。
从begin()到end() 迭代器遍历
2. range for循环 用const auto& pair来捕获每个键值对,并使用pair.first和pair.second分别访问键和值。
map类型
Map容器中存储自定义类型,需要定义一个比较函数或者重载<运算符,以便Map容器可以正确比较和排序自定义类型的对象
key_compare
Java
Map代表一种由多个key-value组成的集合,map集合是set集合的扩展
unordered_set就是在哈希表插入value,而这个value就是它自己的key
HashMap 基于hashing原理,通过put()和get()方法储存和获取对象
TreeMap 基于红黑树的一种提供顺序访问的Map
@override
public int hashCode()
@override
public boolean equals()
python 字典
python内置的哈希函数,将键(key)作为参数进行转换(哈希运算+取余运算),
得到一个唯一的地址(地址的索引),然后将值(value)
字典--关联数组
python 3.6 之前 hash key value
Python 3.7 以后,有序 维护了一个根据插入顺序排序的链表
数据结构
构建-插入元素-删除元素-查找元素
实现
SkipList
跳表最典型的应用是在 Redis 的有序集合,是通过哈希表+跳表来实现的
jdk中提供的实现主要有:ConcurrentSkipListMap与ConcurrentSkipListSet
表:
顺序表
链表
跳表: 链表 索引链表--多层索引 层级数和结点数--以空间换时间
哈希表
树-tree
自平衡的二叉查找树--红黑树
std::map
抽象语法树(AST)
文档对象模型(DOM)也是树结构
堆是一种特殊的数据结构,它是一棵完全二叉树 Heap
图-graph 节点(Vertex)和边(Edge
图的存储结构主要分为两种:邻接矩阵以及邻接表
深度优先遍历(DFS)以及广度优先遍历(BFS)
最短路径算法
DAG: 任务调度
控制流图(Control Flow Graph,CFG)和数据依赖图(Data Dependence Graph,DDG)
网络: net
使用示例
vector<int > twoSum(vector<int> & num,int target)
{
unorder_map<int,int> m;
vector<int> temp;
int nums_len = num.siez();
// 转换为 hash字典
for(int i = 0;i < nums_len;i++)
{
m[num[i]] =i;
}
for(int i = 0;i<nums_len;i++)
{
if(m.count(target-num[i])) &&m[target-num[i]] !=i{
temp.emplace_back(i);
temp.emplace_back(m[target-num[i]]);
return temp;
}
}
return temp;
}
###代码说明
键在unordered_map中出现的次数。
由于unordered_map 不允许有重复的键,所以返回值要么是0(键不存在),要么是1(键存在)
可读性和规范性
Cmake
###搜索指定目录下源文件添加到变量中
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
add_executable(MyApp ${DIR_SRCS})
## file 命令的一种模式,GLOB 用于获取匹配指定通配符模式的文件
file(GLOB DIR_SRCS "src/*.cpp")
add_executable(MyApp ${DIR_SRCS})
###其 通过file命令,我们可以进行文件的读写、复制、删除等操作,同时还可以获取文件的属性和状态信息
file(READ filename variable):
读取指定文件的内容,并将结果存储到变量中。
CMaleLists.txt
rm -rf ./build && mkdir ./build && cd ./build
cmake ..
make
其中 cmake .. (to use the default build system) 或者 cmake .. -G Ninja
或者:
mkdir ./build && cd ./build
cmake ..
cmake --build .
不直接 make,而是使用 cmake --build 形式的命令,主要是为了跨平台,使用这种形式后,不管你是使用的什么生成器,CMake 都能正确构建
## Configuration 阶段,为不同的构建工具生成相应文件。-S 指定 CMakeLists.txt 所在目录,
## -B 指定输出目录,cmake 读取 CMakeLists.txt 同时收集环境及项目配置信息,写入 CMakeCache.txt 中
cmake -S . -B build
cmake --build build
# build 阶段,使用构建工具构建默认 target
-S <path> 或 --source <path>: 指定项目的源代码目录。这个路径应该是包含 CMakeLists.txt 文件的目录。
-B
模型推理
前向传播(Forward Propagation) 将新数据输入神经网络,通过前向传播计算得到预测结果
模型训练
前向传播--预测结果 --> 根据预测结果和真实标签计算损失值-->损失函数
反向传播--> 优化算法-->更新模型参数
标签:Map,cmake,函数,map,--,数据类型,C++,build,哈希
From: https://www.cnblogs.com/ytwang/p/18613111