C++_数据结构-Map数据类型

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 或 --build : 指定构建

模型推理

 前向传播(Forward Propagation) 将新数据输入神经网络,通过前向传播计算得到预测结果
 
 
模型训练  
    前向传播--预测结果 --> 根据预测结果和真实标签计算损失值-->损失函数
    反向传播--> 优化算法-->更新模型参数		
posted @ 2024-12-17 17:43  辰令  阅读(195)  评论(0)    收藏  举报