实现下linkedhashset
时间: 2024-10-08 17:14:11 浏览: 30
在C++中,实现一个`LinkedHashSet`结合了链表(用于快速插入和删除)和哈希表(用于快速查找和去重)的概念。这是一个自定义的数据结构,通常不直接由标准库提供,但可以通过组合`std::unordered_set`(哈希集合)和自定义双向链表节点来创建。
首先,我们需要一个链表节点类(Node),包含数据值和指向下一个节点的指针:
```cpp
template <typename T>
class Node {
public:
T value;
Node<T>* next;
Node<T>* prev;
};
```
然后,我们可以创建LinkedHashSet类,继承自`std::unordered_set`并添加链表操作:
```cpp
#include <unordered_set>
template <typename T, typename Hash = std::hash<T>, typename Pred = std::equal_to<T>>
class LinkedHashSet : public std::unordered_set<T, Hash, Pred> {
private:
std::unordered_set<T, Hash, Pred>::iterator _last_inserted;
public:
// 添加元素时保持链表顺序
void insert(const T& val) {
auto it = find(val);
if (it == end()) {
_last_inserted = emplace_back(val);
} else {
_last_inserted = it;
}
}
// 删除元素同时更新链表
void erase(const T& val) {
auto it = find(val);
if (it != end()) {
_last_inserted = erase(it);
if (_last_inserted->prev) {
_last_inserted->prev->next = _last_inserted->next;
}
if (_last_inserted->next) {
_last_inserted->next->prev = _last_inserted->prev;
}
}
}
// 返回最后一个插入的元素
const T& last_inserted() const { return *_last_inserted; }
};
```
现在你可以使用这个`LinkedHashSet`就像普通的`std::unordered_set`一样,但是插入和删除操作会维护插入顺序:
```cpp
int main() {
LinkedHashSet<int> set;
set.insert(5);
set.insert(3);
set.insert(7);
std::cout << "Last inserted: " << set.last_inserted() << "\n";
set.erase(5);
// ...
}
```
阅读全文
相关推荐


















