STL06——手写一个简单版本的set
STL06——手写一个简单版本的set
- 1.特点
- 2.使用方法
- 3.【STL 专题之 Set】Set 的实现
1.特点
- 唯一性:
std::set
中不允许存储重复的元素,每个元素都是唯一的。插入重复元素,那么什么都不会发生。 - 有序性:
std::set
中的元素是按照升序进行排序的。(这种排序是通过红黑树的自平衡性质实现的,保证了插入、删除等操作的高效性) - 插入元素: 使用
insert
成员函数可以将元素插入到集合中,如果元素已存在,则插入操作会被忽略。
2.使用方法
- 包含 #include
- 用途:用于存储一组唯一的元素,并按照元素的值进行排序
- 也为存储唯一元素提供了高效的查找、插入和删除操作。
3.【STL 专题之 Set】Set 的实现
题目描述
本题需要设计一个 Set 类,实现如下功能:
**
**
1、基础功能
- 构造函数:初始化 Set 实例
- 析构函数:清理资源,确保无内存泄露
2、核心功能
- 在 Set 中插入一个元素
- 在 Set 中删除一个元素
- 判断一个元素是否在 Set 中
- 判断 Set 是否为空
- 获取 Set 的大小
输入描述
题目的包含多行输入,第一行为正整数 N, 代表后续有 N 行命令序列。
接下来 N 行,每行包含一个命令,命令格式为 [operation] [parameters] ,具体命令如下:
**
**
insert 命令:
- 格式:insert [element]
- 功能:在 Set 中添加 element,如果元素已经存在,则不进行任何操作
erase 命令
- 格式:erase [element]
- 功能:删除 Set 中的元素 element,如果集合中不存在 element,则不进行任何操作
contains 命令:
- 格式:contains [element]
- 功能:判断 Set 中是否包含 element 元素
empty 命令:
- 格式:empty
- 功能:判断 Set 是否为空
size 命令:
- 格式:size
- 功能:获取 Set 的大小
输出描述
输出为每行命令执行后的结果,具体输出格式如下:
insert 命令:无输出
erase 命令:无输出
contains 命令:如果 Set 中存在该元素,则输出 true,否则输出 false,输出独占一行
empty 命令:如果 Set 为空,则输出 true,否则输出 false,输出独占一行
size 命令:输出一个整数,独占一行,表示 Set 的大小
#include"RedBlackTree.h"
template<typename Key>
class Set
{
public:Set():rbTree(){}void insert(const Key& key){rbTree.insert(key, key);//key和value都是key}void erase(const Key& key){rbTree.remove(key);}size_t size(){return rbTree.getSize();}bool empty(){return rbTree.empty();}bool contains(const Key& key){if (rbTree.at(key) != NULL)return true;elsereturn false;}
private:redBlackTree<Key, Key> rbTree;
};int main() {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 == "earse") {iss >> element;mySet.erase(element);}if (command == "contains") {iss >> element;std::cout << (mySet.contains(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;
}