[C++STL教程]5.set是什么?怎么用?零基础都能看懂的入门教程【全网最佳STL入门教程系列】

59 篇文章 0 订阅

之前我们介绍过vector, queue, stackmap。我们知道前三者是线性结构,而map是一种树状结构,今天我们要介绍另外一个树状结构实现的stl容器:set

🎈 作者:Eriktse
🎈 简介:19岁,211计算机在读,现役ACM银牌选手🏆力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)🚀
🎈 个人博客:www.eriktse.com

本文仅从入门和实用角度进行讲解,主要针对初学者或竞赛向。如有不严谨的地方欢迎指正!

什么是 set?

set意为集合,在高中我们学习过集合的三大性质:确定性、互异性、无序性。在C++的STL中的集合,容器内会默认按照“升序”排列,但同样遵循确定性和互异性

C++ STL Set

Set是C++标准模板库(STL)中较为重要的容器,原生支持有序,唯一。

一个大小为nset所需的空间约为nlogn个单位。set的插入、删除、查找操作复杂度均为O(logn)

关键特性
  • 唯一性:Set容器内的元素都是唯一的,也就是说,每个元素都是不同的

  • 有序性:Set容器内的元素总是排序的,向Set中添加元素,它将自动插入到正确的位置中,不需要手动排序

  • 查找/插入快速:因为Set容器的元素是排序的,所以在Set中查找和插入元素都很快

适用场景

Set容器的有序性和唯一性特性极大地减少了大量重复和排序等工作,在很多场景下Set容器更具优势,下列情况是使用Set容器合适的情况:

  1. 存储元素类型不能够重复的场景,比如存储用户的唯一ID
  2. 操作多个对象时,必须使用排序算法的场景
  3. 需要快速查找插入元素的场景

通过Set容器,可以快速获取唯一和有序的结果,同时在大数据量下性能也相对较高,因此使用场景广泛。

初始化 set

在使用set之前,需要引入头文件#include <set>,当然你也可以用#include <bits/stdc++.h>(竞赛选手推荐)。

用以下代码,声明一个空的set

set<int> st;//声明一个存储类型为 int 的 set 容器

插入元素

insert(x)方法:将元素x插入到set对象中,如果set中已经有了x元素,则不会插入(保证set中每个元素最多出现一次)。

C++中的STL中提供了一种集合容器——Set,static set它是一个拥有特殊功能(无序、不允许重复)的容器。STL中Set如何插入元素呢?

1.使用insert函数插入元素:

(1)一个元素的插入:

set容器提供的insert函数可以将一个元素插入到容器中,代码如下:

set<int> a;
a.insert(10);

此外,也可以插入pair类型的数据,如:

set<pair<int, int> > b;
b.insert(std::make_pair(2, 3));
(2)多个元素的插入:
vector<int> array{1, 2, 3};
set<int> a;
a.insert(array.begin(), array.end());

2.使用emplace函数插入元素:

emplace函数向set容器中添加一个新元素,但不复制或移动现有元素,而是直接在容器存储区中构造元素。它的作用和insert函数相同,但emplace函数的效率会更高。

set<int> a;//a : {empty}
a.emplace(10);//a : {10}

删除元素

在使用set删除元素之前,需要理解关于set的删除元素方式,目前c++ STL提供了三种删除set元素的方式: clear()erase() 、 和 pop_back()

要删除set中的元素,通常是使用erase()函数:

// 声明一个set容器
std::set<int> st;
// 添加元素到容器

st.insert(9);
st.insert(5);
st.insert(1);
// 如果要删除set中的某个值

int value = 5;
st.erase(value);//删除st中value = 5的数据项

// 如果要删除set中的某个指定的位置的值

std::set<int>::iterator it = /* Set Iterator */;
st.erase(it);

// 此外,还提供了clear()函数来清空set中的所有元素:
st.clear();

// 最后,也可以使用pop_back()函数来删除set中的一个元素:
st.pop_back();

查找元素

C++STL的set提供了非常方便的查找操作,也即我们常说的find操作。find操作的使用非常简单,可以使用Iterator类型的游标变量,对Set成员集合进行定位,若要查找的元素存在,则会返回该元素的位置信息,若不存在,则返回set末尾迭代器(未设定取值)。

set<int> myset;
set<int>::iterator it;//声明一个iterator
//向Set中添加一系列元素
for(int i=1; i<10; i++)myset.insert(i*10);

//输出原始Set集合元素
cout<<"The original set elements are:"<<endl;
for(it=myset.begin(); it!=myset.end(); it++)cout<<*it<<" ";
cout << endl;

//查找Set中是否包含指定的元素
int num = 50;
it =myset.find(num);//返回迭代器
cout<<"输入要查找的元素:" << num << endl;

if(it != myset.end())cout << "找到指定元素:" << *it << endl;
else cout << "未找到指定元素!" << endl;

获取元素个数

获取set中元素的个数可以调用其内置的函数size()

cout << "the size of set is: " << s.size() << endl;

以上例子中,我们声明了一个set,然后调用它的size()函数获取set中元素的个数,即可以获取到set中元素的个数。

判断是否为空

判断set是否为空可以调用其内置函数empty()

cout << "The set is empty? " << (s.empty() ? "Yes" : "No") << endl;

以上例子中,我们声明了一个set,然后调用它的empty()函数判断set是否为空,empty()函数的返回值为truefalse,如果set不为空,则返回false,反之,则返回true

判断元素是否存在集合中

count(x)方法返回set中元素x的个数,由于个数只能是0或1,所以当返回值非0时表示元素在集合中,反之不在。

multiset中一个元素可以存在多次。

count()方法非常常用,用于判断是否已经计算过从而剪枝,或者图论中的判重等等。

遍历 set

一、迭代器的使用

迭代器的使用,是一种很常用的遍历方法,使用它可以让我们很方便地遍历set中的元素,示例代码如下:

#include<iostream>
#include<set>
using namespace std;
int main( )
{
	//定义一个set
	set<int> mySet;
	mySet.insert(20);
	mySet.insert(40);
	mySet.insert(30);
	mySet.insert(50);
	//定义一个迭代器
	set<int>::iterator it;
	//遍历set
	for(it = mySet.begin( ); it != mySet.end( ); it++)
	{
		cout<<*it<<" ";
	}
	cout<<endl;
	return 0;
}

用auto关键字也可以进行遍历,和遍历map差不多,可以看这篇文章:https://www.eriktse.com/technology/1069.html

二、for_each的使用

要使用for_each对set中的元素进行遍历,需要将其传入一个可调用的对象,可以使用仿函数。示例代码如下:

#include<set>
#include<iostream>
#include<algorithm>

struct MyPrinter
{
	void operator()(int val)
	{
		std::cout<<val<<" ";
	}
};

int main()
{
	//定义一个set
	set<int> mySet;
	mySet.insert(20);
	mySet.insert(40);
	mySet.insert(30);
	mySet.insert(50);
	//有点怪异的写法
	for_each(mySet.begin(),mySet.end(),MyPrinter());
	cout<<endl;
	return 0;
}

总结

以上是set容器的简单总结,set容器拥有唯一性,有序性以及快速插入,在一定场景下,可以帮助我们快速解决问题。

🎈 本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞👍、收藏⭐、留言💬

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++ STL(标准模板库)是一种强大的C++编程技术,它提供了许多有用的容器类、算法和迭代器来帮助程序员更轻松地编写高效的代码。 如果您正在学习C++编程,或者想要深入了解STL的工作原理,那么C++ STL教程是您的理想选择! C++ STL教程提供了一个全面的STL教程,涵盖了STL的各个方面,包括容器类、算法、迭代器和其他一些常用的STL功能。这个教程适合新手C++程序员和有经验的程序员,因为它从最基本的开始,逐步深入,并且提供了许多示例和代码片段来帮助人们理解不同的概念。 如果您想下载C++ STL教程的PDF版本,您可以通过搜索引擎找到几个网站提供下载。在下载之前,确保您选择的PDF教程是最新的版本,因为STL在不断地更新和改进。 需要注意的是,C++ STL教程PDF只是一种学习工具。 您应该通过亲身体验来练习和理解STL的概念和功能。请尝试编写自己的代码,并利用在线资源和社区来解决任何可能的问题或疑问。最终,您将练就出一双擅长利用C++ STL的手! ### 回答2: STL(Standard Template Library,标准模板库)是C++中非常重要的一部分,它提供了许多数据结构和算法,用于快速编写高效率的程序。如果您想要深入学习STL,那么我们强烈推荐您下载一份相关的STL教程PDF。 STL教程PDF汇集了许多关于STL的知识点,从基础概念到高级应用,全方位地讲解了STL的内容。通过学习STL教程PDF,您可以更好地掌握STL的使用方法和原理,提高程序设计的效率和质量。 同时,STL教程PDF中也包含了许多实用的编程案例,可以帮助读者更好地理解STL的使用,更加深入地了解C++语言。所以,无论您是初学者还是有一定经验的程序员,都非常适合使用STL教程PDF进行学习。 最后,我们建议您通过网络搜索引擎进行STL教程PDF的下载,或者在相关社区群组中寻找资源下载。我们相信,通过学习STL教程PDF,您一定可以得到更好的编程体验,让您的程序设计更加精准高效! ### 回答3: c stl教程 pdf下载是一种获取C++编程知识的方法。C++是一种非常强大的编程语言,STL是C++的一部分,它提供了许多常用数据结构和算法的实现。想要提高自己的编程技能,阅读相关的资料是很重要的。因此,c stl教程 pdf下载可以帮助您更好地理解C++和STL的使用。 在c stl教程 pdf中,你会得到很多非常有用的信息和技巧,包括如何使用STL容器(如vector、list、set、map等)以及STL算法(如排序、查找、合并、拷贝等)。此外,你还可以学习如何使用迭代器这种重要的概念,以及如何自己实现STL容器和算法。对于想要在自己的代码中使用STL来提高效率和减少编写代码量的开发人员来说,这些知识都非常重要。 最后,想要通过c stl教程 pdf来提高自己的编程能力,还需要多加实践。阅读资料可以帮助你理解概念和技巧,但只有亲自尝试才能真正掌握它们。因此,在学习过程中要多写代码,多做一些练习和项目,这样才能更好地理解和应用所学知识,提高自己的技能水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值