C语言到C++STL菜鸟教程:Set(集合)容器

2022-07-1712:53:18编程语言入门到精通Comments1,227 views字数 1607阅读模式

1. 简介文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树(可能读者对此不太了解,等但学到树论与图论的章节的时候就会明白原因),其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相关的操作文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

2. 相关文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

头文件:#include<set>文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

3. 初始化文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

初始化格式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

template class T,                        
           class Compare = less<T>,        
           class Alloc = allocator<T>      
           class set;

基本上就是三个参数,第一个是值,第二个比较器,用于比较内容,默认为less<Key>即降序,第三个是内存配置器,负责内存的分配和销毁。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

在实际使用中,我们仅仅为其分配值就足以满足大部分需求。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

set<int> s;       //直接指定值的类型创建,其他为默认方法
//其余方法与前文的创建方法类似,不做具体展示……

4. 迭代器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

C98标准下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

 for (set<int>::iterator it=s.begin(); it!=s.end(); ++it)
        cout << *it << ' ';

这也是前文学过的标准用法,接下来,让我们了解一个更加先进和便捷的方法,auto方法迭代,这需要我们编译器开启C11标准,每个编译器的开启标准不一,请具体情况具体分析。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

C11标准下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

 for (auto it=s.cbegin(); it!=s.cend(); ++it)
        cout << *it << ' ';

可见我们使用了auto进行了迭代器类型的自动识别,省去了我们的声明迭代器的那一部分内容,这使得代码更加简化。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

5. 常用接口文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

我们使用set<int> s 预先创建了一个集合,命名为s,方便举例文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

a)大小size()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

返回元素的个数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

函数原型:size_type size() const;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

cout<<s.size()<<endl;   //直接返回元素个数

b) 插入元素insert()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

插入一个元素,插入元素的类型必须与创建的容器类型一致文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

函数原型:pair<iterator,bool> insert (const value_type& val);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

s.insert(i);

c)删除元素erase()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

删除一个元素,或者是一段区间的元素,将会自动缩减空间使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

函数原型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

iterator erase (iterator position);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

iterator erase (iterator first, iterator last);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

使用方法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

s.erase(s.begin());  //使用迭代器的方法删除第一个元素
s.erase(s.begin(),s.end());     //删除一段内容,这里是全部删除

d)清空元素clear()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

将整个set集合中的内容清空,注意,这里只是清空元素,其所占用的最大内存空间还是不会改变的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

s.clear();

e)查找元素find()文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

函数原型:iterator find (const value_type& val) const;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

函数原型:iterator find (const value_type& val) const;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

Find方法返回一个迭代器类型的指针,因此我们直接通过find获取其数据的时候需要使用指针*的方式进行表示,否则将会报错。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

cout<< *s.find(4) <<endl;

或者 实现找到的删除指定元素文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html

s.erase(s.find(4));
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/25123.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/25123.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定