#include <iostream>
#include <set>
using namespace std;
typedef struct STRUC
{
int x;
int y;
}STRUCT;
int main()
{
STRUCT struc1, struc2, struc3;
struc1.x = 1;
struc1.y = 2;
struc2.x = 3;
struc2.y = 4;
struc3.x = 5;
struc3.y = 6;
long add1 = (long)&struc1;
long add2 = (long)&struc2;
long add3 = (long)&struc3;
set<long> myset;
myset.insert(add1);
myset.insert(add2);
myset.insert(add3);
set<long>::iterator iterCur = myset.begin();
set<long>::iterator iterEnd = myset.end();
//遍历并获取x和y的值,此时你爱怎么比较大小都可以了
for (; iterCur != iterEnd; ++iterCur)
{
cout<<((STRUCT*)(*iterCur))->x<<endl;
cout<<((STRUCT*)(*iterCur))->y<<endl;
}
system("pause");
return 1;
}
追问{
coutxy<<endl;
}
这个没看明白,我要怎么比较大小啊????
追答iterCur是指向set集合中当前元素的指针,*iterCur就是当前元素的值,而这个值是long型,它代表了对应结构体的地址,为了通过这个地址去调用这个结构体,首先就要把这个long型值转换成指向结构体的指针,我们用这个符号(STRUCT*)来转换*iterCur,这就是数据类型的强制转换,写出来就是:(STRUCT*)(*iterCur)。后面一个括号是set集合中的long值,前面一个括号把这个long值转换成了STRUCT类型的指针。既然获取到结构体指针了,那当然就可以通过指针操作符“->”来获取结构体中的成员变量,于是就有了((STRUCT*)(*iterCur))->x,这就是这个结构体中的x的值,取y的值同理。你在遍历的时候就可以把每一个结构体的x和y值都取出来,既然x和y的值都已经能够获取到了,那你想比较哪两个变量就直接有>或<来比较就好了。
追问我想在for循环中用((STRUCT*)(*iterCur))->x 和 ((STRUCT*)(*(iterCur+1)))->x 比较大小,但是比到最后一个会越界啊,应该怎么加什么处理???
追答if(iterCur != myset.end())
{
//用((STRUCT*)(*iterCur))->x 和 ((STRUCT*)(*(iterCur+1)))->x 比较大小;
}
把if判断语句写在for循环内部。
但iterCur+1这样的写法默认是通不过编译的,除非你已经对“+”进行了重装。
像下面这样做可以实现:
int a;
for (; iterCur != iterEnd;)
{
a = ((STRUCT*)(*iterCur))->x;
if(iterCur.operator++() != iterEnd)
{
if(a > ((STRUCT*)(*iterCur))->x)
{
//执行你的操作
cout<<"大"<<endl;
}
else
cout<<"小"<<endl;
}
}