C++ STL中的无序集
C++标准模板库支持几种数据结构,这些数据结构在任何程序员的生活中都起着重要作用。
这样的数据容器之一就是" C++中的无序集"。
与STL集不同,这些类型的集在存储元素方面是无序的。
无序集的属性
以下是C++ STL中无序集的属性。
唯一性–无序集中的每个元素都是唯一的。
未索引-无序集合中的元素无法按位置索引,例如矢量和地图。
不可变–我们无法修改或者更改无序集中的元素。
集合仅支持其元素的添加和删除。内部实现–我们使用哈希表实现无序集
初始化无序集
有多种方法可以在C++中初始化无序集。
//For the usage of unordered set #include<unordered_set> //For input output #include<iostream> using namespace std; int main(){ //Method - 1 //An empty unordered set of integers unordered_set<int> s1; //Method - 2 //Hard-coded unordered set unordered_set<int> s2 = {1, 4, 8, 3, 2}; //Method - 3 //Initializing an unordered set using another unordered set unordered_set<int> s4(s2); //s4 = {1, 4, 8, 3, 2} //Method - 4 //Initializing an unordered set using arrays int arr[] = {6, 2, 4, 5, 1}; unordered_set<int> s5(arr, arr+3); //s4 = {4, 2, 6} }
第四种方法以相反的方式保存元素。
这是因为元素插入在无序集合的开头。
遍历无序集
我们必须初始化一个迭代器,该迭代器将负责遍历集合并访问每个元素。
无序集支持两个返回迭代器的内置函数。
begin()–将迭代器返回到集合的第一个元素。
end()–返回经过集合最后一个元素的迭代器。
通过这两个功能,我们将知道集合的开始和结束。
//For the usage of unordered set #include<unordered_set> //For input output #include<iostream> using namespace std; int main(){ //Hard-coded unordered set unordered_set<int> s1 = {1, 4, 8, 3, 2}; //Initializing an iterator for unordered set unordered_set<int> :: iterator it; //Printing each element for(it=s1.begin(); it != s1.end(); it++) cout<<*it<<" "; cout<<endl; }
输出:
2 3 4 8 1
迭代器可用于使用'*'运算符获取其指向的值。
将元素添加到无序集中
元素的插入是在使用insert()
函数时发生的。
//For the usage of unordered set #include<unordered_set> //For input output #include<iostream> using namespace std; int main(){ //Hard-coded unordered set unordered_set<int> s1 = {1, 4, 8, 3, 2}; //Inserting elements in the set s1.insert(5); s1.insert(10); s1.insert(4); //Initializing an iterator for unordered set unordered_set<int> :: iterator it; //Printing each element for(it=s1.begin(); it != s1.end(); it++) cout<<*it<<" "; cout<<endl; }
输出:
10 1 8 4 3 2 5
如果我们尝试插入无序集中已经存在的元素,则不会收到错误消息。
在无序集中插入的平均时间复杂度为O(1),在最坏的情况下可能趋于达到O(n)。
从无序集中删除元素
删除过程非常简单。
我们可以搜索最初创建的哈希表以删除特定元素。erase()
函数接收要从集合中删除的值。
//For the usage of unordered set #include<unordered_set> //For input output #include<iostream> using namespace std; int main(){ //Hard-coded unordered set unordered_set<int> s1 = {1, 4, 8, 3, 2}; //Deleting elements from the set s1.erase(8); s1.erase(1); s1.erase(5); //Initializing an iterator for unordered set unordered_set<int> :: iterator it; //Printing each element for(it=s1.begin(); it != s1.end(); it++) cout<<*it<<" "; cout<<endl; }
输出:
2 3 4
与insert()
函数类似,当我们尝试删除集合中不存在的元素时,不会引发任何错误。
添加和删除元素的复杂性是相似的。
在C++中搜索无序集中的元素
与哈希表一样,在无序集合中搜索元素非常省时。
通常情况下,只需要O(1)时间即可检查元素是否存在于集合中。
这是对有序集合的O(logN)时间复杂度的巨大改进,该集合使用平衡的BST进行内部实现。
搜索机制是通过find()
函数来抽象的,该函数接受要搜索的值,并将迭代器返回到该位置。
如果不存在该值,则它将返回该集合的最后一个元素之后的迭代器。
//For the usage of unordered set #include<unordered_set> //For input output #include<iostream> using namespace std; int main(){ //Hard-coded unordered set unordered_set<int> s1 = {1, 4, 8, 3, 2}; int value = 8; //Searching 'value' in the unordered set if(s1.find(value) != s1.end()) cout<<value<<" is present in the set"<<endl; else cout<<value<<" is not present in the set"<<endl; value = 7; //Searching 'value' in the unordered set if(s1.find(value) != s1.end()) cout<<value<<" is present in the set"<<endl; else cout<<value<<" is not present in the set"<<endl; }
输出:
8 is present in the set 7 is not present in the set
这总结了C++ STL中无序集合的基本操作。
其他有用的设定功能
一些有用的功能可能会派上用场:
size()–返回无序集中元素的数量。
empty()–如果集合为空,则返回true,否则返回false。
clear()–清空整个集合。
swap(set1,set2)–交换作为参数传递的完整集。
emplace(value)–将作为参数传递的值插入到集合中。
count(value)–返回集合中某个值的频率,可以为1或者0。