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 集合应该怎么用,求简单的初始化,添加值,和遍历!!!的主要内容,如果未能解决你的问题,请参考以下文章