C++STL之unordered_set简单使用

2023-11-04

目录

简介

常用函数

代码

运行截图

参考


简介

unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。

总的来说,unordered_set 容器具有以下几个特性:

  1. 不再以键值对的形式存储数据,而是直接存储数据的值;
  2. 容器内部存储的各个元素的值都互不相等,且不能被修改。
  3. 不会对内部存储的数据进行排序(这和该容器底层采用哈希表结构存储数据有关);

对于 unordered_set 容器不以键值对的形式存储数据,读者也可以这样认为,即 unordered_set 存储的都是键和值相等的键值对,为了节省存储空间,该类容器在实际存储时选择只存储每个键值对的值。

常用函数

常用成员函数 功能
iterator begin() noexcept 返回指向容器中第一个元素的正向迭代器。
iterator end() noexcept 返回指向容器中最后一个元素之后位置的正向迭代器。
bool empty() const noexcept 若容器为空,则返回 true;否则 false。
size_type size() const noexcept 返回当前容器中存有元素的个数。
iterator find(const key_type& k) 查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器(如果 end() 方法返回的迭代器)。
size_type count(const key_type &k) const 在容器中查找值为 key 的元素的个数。
pair<iterator, iterator> qual_range(const key_type &k) 返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中值为 key 的元素所在的范围。
template <class... Args>
pair<iterator, bool> emplace ( Args&&... args )
向容器中添加新元素,比 insert() 方法效率高
template <class... Args>
iterator emplace_hint ( const_iterator position, Args&&... args )
向容器中添加新元素,效率比 insert() 方法高。
pair<iterator,bool> insert (value_type& val ) 建议使用emplace()代替
iterator insert ( const_iterator hint, value_type&& val ) hint,迭代到建议作为插入点的位置。容器可能会使用此值,也可能不会使用此值来优化操作。无论将什么作为hint传递,该元素都将存储在其相应的存储桶中。成员类型const_iterator是正向迭代器类型。
template <class InputIterator>
void insert ( InputIterator first, InputIterator last )
指定元素范围的迭代器。范围为[first,last)的元素的副本插入到unordered_set容器中。
模板类型可以是任何类型的输入迭代器。
void insert ( initializer_list<value_type> il ) 一个initializer_list对象。编译器将根据初始化列表声明器自动构造此类对象。成员类型value_type是容器中包含的元素的类型,在unordered_set中定义为第一个模板参数(Key)的别名。
iterator erase ( const_iterator position ) position,指向要从unordered_set中删除的单个元素的迭代器。成员类型const_iterator是正向迭代器类型。
size_type erase ( const key_type& k ) k,要删除的元素的键。成员类型key_type是容器中元素的键的类型,在unordered_set中定义为其第一个模板参数(Key)的别名。
iterator erase ( const_iterator first, const_iterator last )

迭代器在unordered_set容器中指定要删除的范围:[first,last)。
请注意,unordered_set容器不遵循任何特定顺序来组织其元素,因此范围删除的效果可能不容易预测。成员类型const_iterator是正向迭代器类型。尽量不用这个函数。

void clear() noexcept 清空容器,即删除容器中存储的所有元素。
void swap ( unordered_set& set ) 交换 2 个 unordered_set容器存储的元素,前提是必须保证这 2 个容器的类型完全相等。

代码

/*
Project:unordered_set
Date:    2020/09/05
Author:  Frank Yu
*/
#include<iostream>
#include<string>
#include<unordered_set>
using namespace std;
unordered_set<float> us;
unordered_set<float>::iterator it;
//菜单
void menu()
{
	cout << "******1.插入		2.删除******" << endl;
	cout << "******3.查找		4.显示******" << endl;
	cout << "******5.退出					" << endl;
}
//插入
void Insert()
{
	int i, n;float f;
	cout << "请输入要插入几个小数:" << endl;
	cin >> n;
	cout << "请输入" << n << "个小数:" << endl;
	for (i = 0; i<n; i++)
	{
		cin >> f;
		us.emplace(f);
	}
}
//删除
void Delete()
{
	int i, place, flag;
	float ff;
	cout << "******1.删除某个浮点数     2.删除某位置的浮点数******" << endl;
	cout << "******3.全部删除                               ******" << endl;
	cin >> i;
	switch (i)
	{
	case 1: {
		cout << "请输入浮点数:" << endl;
		cin >> ff;
		flag = us.erase(ff);
		if (flag == NULL)cout << "没有这个浮点数,删除失败。" << endl;
		else cout << "删除成功!" << endl;
	}break;
	case 2: {
		cout << "请输入位置(首元素位置为0):" << endl;
		cin >> place;
		if (place<0 || place>us.size())cout << "位置不在范围内。" << endl;
		else
		{
			it = us.begin();
			while (place--)it++;
			us.erase(it);
			cout << "删除成功!" << endl;
		}
	}break;
	case 3:us.clear(); break;
	default:cout << "输入错误!" << endl;
	}

}
//查找
void Find()
{
	float ff;
	cout << "请输入要查找的浮点数:" << endl;
	cin >> ff;
	it = us.find(ff);
	if (it != us.end())
	{
		cout << "找到浮点数:"<<ff<< endl;
	}
	else cout << "没有找到这个浮点数。" << endl;
}
void Display()
{
	cout << "所有浮点数:" << endl;
	for (auto it = us.begin(); it != us.end(); it++)
	{
		cout << *it<< endl;
	}
}
//主函数
int main()
{
	int i;
	while (1)
	{
		menu();
		cout << "请输入菜单号:" << endl;
		cin >> i;
		if (i == 5)break;
		switch (i)
		{
		case 1:Insert(); break;
		case 2:Delete(); break;
		case 3:Find(); break;
		case 4:Display(); break;
		default:cout << "输入错误!" << endl;
		}
	}
	return 0;
}

运行截图

 

参考

cplusplus-unordered_set

更多STL例子:C++ STL的使用

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++STL之unordered_set简单使用 的相关文章

随机推荐