C++STL之unordered_set简单使用
目录简介常用函数代码运行截图参考简介unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。总的来说,unordered_set 容器具有以下几个特性:不再以键值对的形式存储数据,而是直接存储数据的值;容器内部存储的各个元素的值都互
·
目录
简介
unordered_set 容器,可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。
总的来说,unordered_set 容器具有以下几个特性:
- 不再以键值对的形式存储数据,而是直接存储数据的值;
- 容器内部存储的各个元素的值都互不相等,且不能被修改。
- 不会对内部存储的数据进行排序(这和该容器底层采用哈希表结构存储数据有关);
对于 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)。 |
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;
}
运行截图
参考
更多STL例子:C++ STL的使用
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。
更多推荐
已为社区贡献5条内容
所有评论(0)