C++ 的 set 集合应该怎么用,求简单的初始化,添加值,和遍历!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 的 set 集合应该怎么用,求简单的初始化,添加值,和遍历!!!相关的知识,希望对你有一定的参考价值。

求一个简单的例子,还有要写什么头文件???

#include <iostream>
#include <set>
using namespace std;
void main()

set<int> s1; //空set集合
set<int>::iterator it;

int a[]= 1,2,3,4,5;
set<int> s2 (a,a+5); //利用指针对象初始化set集合

s2.insert(0); //插入方法1
s2.insert(s2.begin(),7); //插入方法2
int b[] =10,11,12,13,14,15;
s2.insert(b,b+3); //插入方法3

cout<<"集合s2中的元素:"<<endl;
for(it=s2.begin();it!=s2.end();it++) //遍历
cout<<" "<<*it<<endl;

system("pause");
追问

set集合应该可以放结构体吗

追答

可以啊,在中写你要的类型(要定义过的)就可以了,如set,set

追问

在遍历中我要是想调用集合set 的第一个元素 ,应该怎么调用??? set(0)???

追答

set::iterator it; it可以大致理解为set元素的指针类型;

所以it = s2.begin()就是头一个元素的指针,*it就是取这个元素;
it++就是第二个元素的指针,以此类推。

看遍历操作的代码你就明白了,从头指针到尾指针,取每个元素输出

for(it=s2.begin();it!=s2.end();it++)
cout<<*it<<endl;

set::iterator it; it可以大致理解为set元素的指针类型;

所以it = s2.begin()就是头一个元素的指针,*it就是取这个元素;
it++就是第二个元素的指针,以此类推。

看遍历操作的代码你就明白了,从头指针到尾指针,取每个元素输出

for(it=s2.begin();it!=s2.end();it++)
cout<<*it<<endl;

追问

。。。我是要像在遍历的时候操作集合的值该怎么做啊,我的值是结构体,有x 和y 两个元素,我想要在遍历的时候比较各个值的大小。

参考技术A #include <set>
using namespace std;
int main()

set<int> iset;
iset.clear();
iset.insert(1);
iset.insert(2);
iset.insert(3);
set<int>::iterator iter=iset.begin();
while(iter!=iset.end())

printf("%d\n",*iter);
iter++;

getchar ();
return 0;
追问

set集合应该可以放任何类型的数据吧

追答

set iset;
这里面的 int 可以更改为任意的系统类型、自定义结构体、类、

追问

在遍历中我要是想调用集合set 的第一个元素 ,应该怎么调用??? set(0)???

追答

C++ Sets
集合(Set)是一种包含已排序对象的关联容器
begin()

返回指向第一个元素的迭代器

clear()

清除所有元素

count()

返回某个值元素的个数

empty()

如果集合为空,返回true

end()

返回指向最后一个元素的迭代器

equal_range()

返回集合中与给定值相等的上下限的两个迭代器

erase()

删除集合中的元素

find()

返回一个指向被查找到元素的迭代器

get_allocator()

返回集合的分配器

insert()

在集合中插入元素

lower_bound()

返回指向大于(或等于)某值的第一个元素的迭代器

key_comp()

返回一个用于元素间值比较的函数

max_size()

返回集合能容纳的元素的最大限值

rbegin()

返回指向集合中最后一个元素的反向迭代器

rend()

返回指向集合中第一个元素的反向迭代器

size()

集合中元素的数目

swap()

交换两个集合变量

upper_bound()

返回大于某个值元素的迭代器

value_comp()

返回一个用于比较元素间的值的函数

begin() 返回指向第一个元素的迭代器 set.begin()反回的就是第一个元素的迭代器,可以理解为它的指针。
上面是,一些针对set 的操作函数。不能像你说的那样直接获取,不支持下标访问,这个与vector不同。

追问

。。。我是要像在遍历的时候操作集合的值该怎么做啊,我的值是结构体,有x 和y 两个元素,我想要在遍历的时候比较各个值的大小。

参考技术B set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
构造set集合主要目的是为了快速检索,不可直接去修改键值。

头文件:#include <set>
常用操作:
1.元素插入:insert()
2.中序遍历:类似vector遍历(用迭代器)
3.反向遍历:利用反向迭代器reverse_iterator。
例:
set<int> s;
......
set<int>::reverse_iterator rit;
for(rit=s.rbegin();rit!=s.rend();rit++)
4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。
set<int> s;
s.erase(2); //删除键值为2的元素
s.clear();
5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
set<int> s;
set<int>::iterator it;
it=s.find(5); //查找键值为5的元素
if(it!=s.end()) //找到
cout<<*it<<endl;
else //未找到
cout<<"未找到";
6.自定义比较函数
(1)元素不是结构体:
例:
//自定义比较函数myComp,重载“()”操作符
struct myComp

bool operator()(const your_type &a,const your_type &b)
[
return a.data-b.data>0;


set<int,myComp>s;
......
set<int,myComp>::iterator it;
(2)如果元素是结构体,可以直接将比较函数写在结构体内。
例:
struct Info

string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info &a) const

//按score从大到小排列
return a.score<score;


set<Info> s;
......
set<Info>::iterator it;追问

在遍历中我要是想调用集合set 的第一个元素 ,应该怎么调用??? set(0)???

追答

set中元素的存放顺序是内部计算出来的,不是你放入元素的顺序,也就是说你放入的第N个元素,并不一定存放在set的第N个位置上。

所以对set按照指定位置进行存取是没有意义的。

不过读取第一个元素,和最后一个元素,可以用begin()和end()读出来。(但是读取出来的数据,不是最先(最后)放入的数据)

int main()

        set<int> s;
        s.insert(50);
        s.insert(80);
        s.insert(40);
        s.insert(60);
        if (s.begin()!=s.end()) 
                cout << "first:" << *s.begin() << endl;
                cout << " last:" << *(--s.end()) << endl;
        
        return 0;


------------------------
如果想对元素排序,请用map来做,百度一下"c++ map 排序"

本回答被提问者采纳

java里面的集合框架的set用法应该怎么做

参考技术A 1、Set:它是无序、不重复、该接口中的方法和Collection接口中的方法一致。
继承它的子类有HashSet和TreeSet。
HashSet:底层是哈希表数据结构,不同步的它保证元素的唯一性的方式。
根据元素的两个方法来完成的,一个是HashCode、一个是equals方法,只有当hashCode方法算出哈希值相同时,会再次判断两个元素的equals方法是否为true,如果是true说明两个元素相同,不存储,所以往hashSet集合中存储自定义对象时,要覆盖hashCode,equals方法,通过自定义对象具备的特有数据定义hashCode、equals的具体实现。
treeSet:用于给集合中的额元素按照指定的顺序进行排序,底层是二叉树结构,线程是不同步的。
它保证元素的唯一性,就是通过元素对象的比较方法返回值来确定的,如果为0,则视为两个元素时相同的元素,不存储。
treeset的两种排序方式:
1、让元素自身具备比较功能,就是强制让元素类去实现comparable接口,覆盖compareTo方法,这时元素具备的自然排序,可是如果元素自身不具备比较功能,获取具备的比较功能不是所需要的,这时排序方式就不能用了。
2、让集合自身具备比较功能,需要定义比较器,其实就实现了comparetor接口的子类对象作为参数传递给treeSet集合的构造函数,让treeSet集合一创建就具备了比较功能,该子类必须要覆盖compare方法。

以上是关于C++ 的 set 集合应该怎么用,求简单的初始化,添加值,和遍历!!!的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::set<>是什么 怎么用

java里面的集合框架的set用法应该怎么做

如何用C++实现一个整数类的集合??

Redis学习笔记—— 有一亿个keys要统计,应该用哪种集合?

蓝桥杯C++相关

蓝桥杯C++相关