C++ STL中unordered_set的clear()函数
在C++ STL中,unordered_set是一种集合类型,它可以存储不重复的元素,并能够快速地完成元素的查找、插入和删除等操作。在实际应用中,我们可能需要清空unordered_set中存储的所有元素,此时就需要用到clear()函数了。
unordered_set类模板定义
在介绍clear()函数之前,我们先来看一下unordered_set类模板的定义:
template < class Key, // unordered_set::key_type
class Hash = hash<Key>, // unordered_set::hasher
class Pred = equal_to<Key>, // unordered_set::key_equal
class Alloc = allocator<Key> // unordered_set::allocator_type
> class unordered_set;
unordered_set模板的4个参数分别是:
- Key:元素的类型
- Hash:哈希函数的类型,默认使用std::hash
- Pred:比较函数的类型,默认使用std::equal_to
- Alloc:内存分配器的类型,默认使用std::allocator
unordered_set的定义中还有一个重要的成员函数就是clear()函数,接下来我们将详细介绍该函数的用法和实现原理。
clear()函数介绍
clear()函数用于清空unordered_set中存储的所有元素,其语法如下:
void clear();
clear()函数没有参数,它会直接将unordered_set中所有的元素清除,并释放与这些元素相关的内存.
下面是一个简单的示例,展示了如何使用clear()函数清空unordered_set:
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
unordered_set<int> myset = {2, 1, 3, 4, 5};
cout << "Before clear: ";
for (int x : myset) {
cout << x << " ";
}
cout << endl;
myset.clear();
cout << "After clear: ";
for (int x : myset) {
cout << x << " ";
}
cout << endl;
return 0;
}
输出结果如下:
Before clear: 5 4 3 2 1
After clear:
在上面的代码中,我们首先创建了一个unordered_set并初始化它,然后使用for循环遍历unordered_set的所有元素并输出,在清空unordered_set之前,该unordered_set中包含了5个元素{2, 1, 3, 4, 5}。之后,我们调用了clear()函数将unordered_set中所有元素清空,最后再次使用for循环输出此时的unordered_set中的元素,此时为空。
清空vector和unordered_set的时间复杂度
unordered_set的clear()函数的时间复杂度为O(n),其中n是unordered_set中存储的元素个数。这是因为unordered_set的内部实现是基于哈希表,每次删除元素时需要先查找该元素的位置,然后将其从哈希表中删除。而查找元素的时间复杂度为O(1),所以删除每个元素的时间复杂度也是O(1),因此删除n个元素的总时间复杂度就为O(n)。
相对于vector而言,unordered_set的清空操作时间复杂度更低。vector的清空操作也有一个clear()函数,其时间复杂度为O(n),但是vector在进行插入和删除操作时需要进行大量的元素移动,因此插入和删除操作的时间复杂度为O(n),如果需要频繁地进行元素的插入和删除操作,那么就更适合使用unordered_set。
结论
通过本文的介绍,我们可以看到clear()函数是unordered_set中非常重要的一个函数,它允许我们在需要清空unordered_set时快速地完成此操作。在使用unordered_set时,我们应该充分了解其成员函数的用法和内部实现,以便更加高效地进行开发工作。同时,我们还了解到unordered_set的时间复杂度相对于vector更低,适合进行频繁的插入和删除操作,因此在设计数据结构时,可以根据具体需求选择不同的容器类型。