STL07——手写一个简单版本的unordered_set

STL07——手写一个简单版本的unordered_set

1.特点

  • 唯一性:用于存储唯一元素的集合(使用 HashTable 类作为底层数据结构来维护元素)

  • 只是存储了一个key值,不存储value(哈希表每个参数就是一堆KV, unordered_set只去掉KV中的V就可以了

  • 元素是无序的

    (前2个与set一致,最后一点与set不同)

2.使用方法

  • 包含头文件#include<unordered_set>
  • 提供比set更快的插入、删除和查找操作,但不支持顺序访问和范围查询

3.【STL 专题之 unordered_set】unordered_set 的实现

题目描述

本题需要设计一个 unordered_set 类,实现如下功能:

1、基础功能

  • 构造函数:初始化 unordered_set 实例
  • 析构函数:清理资源,确保无内存泄露

2、核心功能

  • 在 unordered_set 中插入一个元素
  • 在 unordered_set 中删除一个元素
  • 判断一个元素是否在 unordered_set 中
  • 判断 unordered_set 是否为空
  • 获取 unordered_set 的大小

输入描述

题目的包含多行输入,第一行为正整数 N, 代表后续有 N 行命令序列。

接下来 N 行,每行包含一个命令,命令格式为 [operation] [parameters] ,具体命令如下:

insert 命令:

  • 格式:insert [element]
  • 功能:在 unordered_set 中添加元素,如果元素已经存在,则不进行任何操作

erase 命令:

  • 格式:erase [element]
  • 功能:删除 unordered_set 中的元素,如果元素不存在,则不进行任何操作

find 命令:

  • 格式:find [element]
  • 功能:查询 unordered_set 中的元素

empty 命令:

  • 格式:empty
  • 功能:判断无序集合是否为空

size 命令:

  • 格式:size
  • 功能:获取无序集合的大小

输出描述

输出为每行命令执行后的结果,具体输出格式如下:

insert 命令:无输出

erase 命令:无输出

find 命令:如果元素存在,则输出 true,否则输出 false

empty 命令:如果 unordered_set 为空,则输出 true,否则输出 false

size 命令:输出 unordered_set 的大小

#include"HashTable.h"
#include<cstddef>

template<typename Key>
class Unordered_set
{
public:
	Unordered_set() :HashTable() {};

	~Unordered_set(){}

	bool empty() const noexcept
	{
		return HashTable.size() == 0;
	}

	size_t size() const noexcept
	{
		return HashTable.size();
	}

	void clear() noexcept 
	{ 
		HashTable.clear(); 
	}

	void insert(const Key& key) 
	{ 
		HashTable.insertKey(key); 
	}

	void erase(const Key& key) 
	{ 
		HashTable.erase(key); 
	}

	bool find(const Key& key)
	{
		return HashTable.find(key) != NULL;
	}
private:
	HashTable<Key, Key> HashTable;
};

int main() {
	Unordered_set<int> mySet;
	int N;
	std::cin >> N;
	getchar();

	std::string line;
	for (int i = 0; i < N; i++) {
		std::getline(std::cin, line);
		std::istringstream iss(line);
		std::string command;
		iss >> command;

		int element;

		if (command == "insert") {
			iss >> element;
			mySet.insert(element);
		}

		if (command == "erase") {
			iss >> element;
			mySet.erase(element);
		}

		if (command == "find") {
			iss >> element;
			std::cout << (mySet.find(element) ? "true" : "false") << std::endl;
		}

		if (command == "size") {
			std::cout << mySet.size() << std::endl;
		}

		if (command == "empty") {
			std::cout << (mySet.empty() ? "true" : "false") << std::endl;
		}
	}
	return 0;
}
unordered_map与unordered_set有什么区别? 回答: unordered_map和unordered_set都是关联式容器,类似于键值对 (key-value) 的模型。它们的底层实现方式不同,unordered_map使用哈希表作为底层数据结构,而unordered_set也是使用哈希表。unordered_map和unordered_set的区别在于它们存储的类型不同,即unordered_map存储键值对,而unordered_set存储单个元素。此外,unordered_map和unordered_set在功能上也有一些区别。unordered_map提供了以键为索引的查找功能,而unordered_set则提供了判断元素是否存在的功能。从效率上来看,unordered_map和unordered_set的增删查改操作的时间复杂度都是O(1),即常数时间。而map和set的时间复杂度为O(logN),其中N是容器中的元素数量。所以在对效率要求较高的情况下,选择unordered_map和unordered_set会更合适。但是,unordered_map和unordered_set相比于map和set会消耗更多的内存空间。因此,在对数据有排序或者对空间有要求的情况下,选择map和set;而对于对效率有要求的情况,选择unordered_map和unordered_set更合适。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STL详解(十二)—— unordered_set、unordered_map的介绍及使用](https://blog.csdn.net/chenlong_cxy/article/details/122277348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [模拟实现unordered_map和unordered_set超详解(C++)](https://blog.csdn.net/m0_67430750/article/details/124760725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [unordered_set和unordered_map的使用【STL】](https://blog.csdn.net/m0_63312733/article/details/128000844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值