首页 > 编程语言 >C++手撕 --基本数据结构的简单实现(2)

C++手撕 --基本数据结构的简单实现(2)

时间:2024-11-06 20:08:55浏览次数:1  
标签:index const val -- C++ return key table 数据结构

C++面试手撕代码----基本数据结构的简单实现(2)

1.哈希表(unordered_map)

#include <vector>
#include <iostream>
#include <list>  // for list
#include <utility> // for pair
#include <functional> // for std::hash

using namespace std;

template<typename K, typename V>

class hashMap {
private:
	static const int TABLE_SIZE = 10;
	vector<list<pair<K, V>>> table; // reslove hash conflict
	
	int myhash(coonst K& key) const { // calulate hash value
		return hash<K>()(key);
	}
	
public:
	hashMap() : table(TABLE_SIZE) {}
	~hashMap() {}
	
	void put(const K& key, const V& val) {
		int index = myhash(key);
		for (auto& pair : table[index]){
			if (pair.first == key){
				pair.second = val;
				return;
			}
		}
		table[index].emplace_back(key, val);
	}
	
	bool get(const K& key, V& val) const { // get value from hash table
		int index = myhash(key);
		for (const auto& pair : table[index]){
			if (pair.first == key){
				val == pair.second;
				return true;
			}
		}
		return false;
	}
	
	bool remove(const K& key, const V& val) { // delete key:value pair in hash table
		int index = myhash(key);
		auto& list_index = table[index];
		for (auto it = list_index.begin(); it != list_index.end(); ++it){
			if (it->first == key){
				list_index.erase(it);
				return true;
			}
		}
		return false;
	}
	
	void show() const { // show key-value pair if it in hash table
		for (int i = 0; i < TABLE_SIZE; ++i){
			if (!table[i].empty()) continue;
			for (const auto& pair : table[i]){
				cout << "{ " << pair.first << ":" << pair.second << " }" << " ";
			}
		}
		cout << endl;
    }
};

2.哈希集合(unordered_set)

#include <vector>
#include <list>
#include <iostream>
#include <functional>  // for std::hash

using namespace std;

template<typename T>
class hashSet {
private:
    const int TABLE_SIZE = 10;
    vector<list<T>> table;

    // 哈希函数
    int myHash(const T& val) {
        return std::hash<T>()(val) % TABLE_SIZE;
    }

public:
    hashSet() : table(TABLE_SIZE) {}
    ~hashSet() {}

    // 插入元素
    void put(const T& val) {
        int index = myHash(val);  // 使用哈希函数计算桶的索引
        for (auto& v : table[index]) {
            if (v == val) {
                return;  // 如果元素已存在,则不插入
            }
        }
        table[index].emplace_back(val);  // 插入元素
    }

    // 检查元素是否存在
    bool check(const T& val) {
        int index = myHash(val);
        for (auto& v : table[index]) {
            if (v == val) {
                return true;  // 找到元素,返回true
            }
        }
        return false;  // 元素不存在,返回false
    }

    // 删除元素
    bool remove(const T& val) {
        int index = myHash(val);
        auto& list = table[index];
        for (auto it = list.begin(); it != list.end(); ++it) {
            if (*it == val) {
                list.erase(it);  // 删除找到的元素
                return true;
            }
        }
        return false;  // 删除失败,返回false
    }

    // 输出集合中的所有元素
    void show() const {
        cout << "Set: " << endl;
        for (int i = 0; i < TABLE_SIZE; ++i) {
            if (!table[i].empty()) {
                for (auto& v : table[i]) {
                    cout << v << " ";
                }
            }
        }
	cout << endl;
    }
};

标签:index,const,val,--,C++,return,key,table,数据结构
From: https://www.cnblogs.com/mochacoco/p/18526305

相关文章

  • 游记:CSP-J/S 2024
    成绩放了,来补写一下今年的游记。09-21初赛日今年我初赛的考点在辅轮中学。家离得有点远,于是就住的酒店。早上起得比较早,在酒店吃完早饭后就到考点门口。早上人挺多,好多都是xxs,排了20多分钟的队终于进去了。在教学楼底下碰见了fyh和cmh,又看了一眼原码反码补码的知识点,就......
  • 学习java的第三天,循环语句(for-while-do while),数组,随机数
    for循环for循环是我最喜欢使用的循环语句,清晰,简洁。##for循环的格式为:for(初始化值,如inti=0;循环条件,如i<10;重新赋值,如i++){ 代码块}注:1.初始化值必须为表达式,如i=0"for(i=0;i<3;i++)"或for(inti=0;i<3;i++),但不可以是一个单独的变量如for(i;i<3;i++)这样会报错!......
  • freeswitch系列1-esl事件大全
    一、通用事件CUSTOM:自定义事件,通常由用户自定义的应用或模块触发,用于特定的业务逻辑通知。CLONE:通道克隆事件,可能在复制通道时触发,比如为了实现特定的呼叫转移或并行处理场景。ALL:表示捕获所有类型的事件,用于需要全面监控系统活动的情况。二、通道相关事件CHANNEL_CREATE:当创......
  • 「模拟赛」NOIP2024 模拟 2
    Rank14,190pts比赛链接新的阶乘容易发现只需要处理1~n的质因子分解即可,每个数\(i\)本来有\(n-i+1\)个我们在欧拉筛的过程中同时维护每个数的一个质因子\(pri\)每次从\(n\)到1把遇到的非质数\(i\)现有的个数加到他的质因子\(pri_i\)和\(\frac{i}{pri_i......
  • 学习笔记(二十六):资源分类与访问(Resources)
    概述:应用开发中使用的各类资源文件,需要放入特定子目录中存储管理。资源目录的示例如下所示,base目录、限定词目录、rawfile目录、resfile目录称为资源目录;element、media、profile称为资源组目录。resources|---base||---element|||---string.json||---media......
  • 基于Multisim篮球比赛24S倒计时电路(含仿真和报告)
    【全套资料.zip】篮球比赛24S倒计时电路设计Multisim仿真设计数字电子技术文章目录功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真+报告+讲解视频.zip】功能篮球比赛24S倒计时功能:1.具有数码管显示24S计时功能。2.设置外部开关,可以直接启动......
  • Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践
    Spark的介绍与搭建:从理论到实践-CSDN博客Spark的Standalone集群环境安装与测试-CSDN博客PySpark本地开发环境搭建与实践-CSDN博客Spark程序开发与提交:本地与集群模式全解析-CSDN博客目录一、SparkonYARN的优势(一)统一化资源管理(二)YARN调度机制的优势二、Spark......
  • 基于Multisim光控夜灯LED电路(含仿真和报告)
    【全套资料.zip】光控夜灯LED电路设计Multisim仿真设计数字电子技术文章目录功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真+报告+讲解视频.zip】功能光控夜灯LED电路1.采用纯数字电路,非单片机。2.通过检测周围光线,光线暗自动开灯,光线亮自......
  • LevelDB 源码中的 C++ 奇淫技巧
    LevelDB整体代码还是比较好懂,没有用很多C++奇淫技巧。不过还是有部分实现,相当比较少见,比如柔性数组、链接符号导出、Pimpl类设计等。本文会梳理这里的C++高级技巧,帮助更好地理解LevelDB的实现。柔性数组在util/cache.cc的LRUHandle结构体定义中,有一个柔性数组(fl......
  • malloc分配内存失败会导致什么问题?
    malloc 是C标准库中的一个函数,用于动态分配内存。接下来解释分配内存失败的原因,危害以及解决方法。原因内存不足:操作系统的可用内存不足以满足请求的分配。这可能是由于系统中正在运行的程序占用了大量内存。请求的大小超出限制:请求分配的内存块过大,超出了系统的内存......