STL set 重复元素

surongr 2011-06-07 11:47:19
首先我定义了一个类型

struct node{
node(int _u, int _w): u(_u), w(_w) { }
bool operator< (const node& rhs) const { return w > rhs.w; }
int u, w;
};
set<node> q;
// 往 q 里添加元素 其中 g[0][i] 的值都是相同的
FOR(i, 1, n-1) {
cost[i] = g[0][i];
q.insert(node(i, cost[i]));
}

假设 n = 4
结果 q 里只插入了第一个元素
即第一个关键字不同而第二个相同的时候没插入到 set 里
为什么?
然后试了只要第二个关键字不同就可以插入 为什么?
...全文
624 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lkp_43669873 2011-07-20
  • 打赏
  • 举报
回复
哎!他们都没懂你的意思,说的牛头不对马嘴,我今天也遇到这个问题,但是我好像突然想明白了,不知道对不对。
其实只要用 < 操作,就可以比较出两个数是否相等,假设比较两个数a,b ,看下面原理
if(a<b==false)
{
//可以判定 a>=b 再做如下判断:
if(b<a==false)
{
//可以判定a==b
}
}
以上只是猜测,我觉得只有这样才能解释set比较器只是一个"<",但却能比较出intser的元素是否和set中的元素相等。


ryfdizuo 2011-06-07
  • 打赏
  • 举报
回复
struct node{
node(int _u, int _w): u(_u), w(_w) { }
bool operator< (const node& rhs) const
{
return w > rhs.w;
}

bool operator> (const node& rhs) const // greater调用就是这个。。。
{
return w > rhs.w;
}
int u, w;
};

int main()
{
set<node, greater<node> > q;
q.insert( node(0, 1) );
q.insert( node(0, 2) );
q.insert( node(0, 3) );

system("PAUSE");
return 0;
}
ryfdizuo 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 surongr 的回复:]

好吧 谢谢
引用 13 楼 dasama 的回复:

额,这是C++STl中的规定,相当于语法规则,没有为什么吧。要不去问问STL的设计者为什么这么规定
- =!!!
[/Quote]
跟踪了一下,set默认是less

template<class _Ty>
struct less
: public binary_function<_Ty, _Ty, bool>
{ // functor for operator<
bool operator()(const _Ty& _Left, const _Ty& _Right) const
{ // apply operator< to operands
return (_Left < _Right); // 这里调用node的operator<
}
};

surongr 2011-06-07
  • 打赏
  • 举报
回复
好吧 谢谢
[Quote=引用 13 楼 dasama 的回复:]

额,这是C++STl中的规定,相当于语法规则,没有为什么吧。要不去问问STL的设计者为什么这么规定
- =!!!
[/Quote]
DAsama 2011-06-07
  • 打赏
  • 举报
回复
额,这是C++STl中的规定,相当于语法规则,没有为什么吧。要不去问问STL的设计者为什么这么规定
- =!!!
surongr 2011-06-07
  • 打赏
  • 举报
回复
可是我试着重载了 == 和 != 都不管用
它偏偏要用 < ?
[Quote=引用 11 楼 dasama 的回复:]

STL进行比较两个元素是否相同时调用<操作符,这边你自己重载了<操作
根据你的要求:第一个关键字不同而第二个相同的时候没插入到 set 里
即w相同时且u不同即插入set中。
[/Quote]
DAsama 2011-06-07
  • 打赏
  • 举报
回复
STL进行比较两个元素是否相同时调用<操作符,这边你自己重载了<操作
根据你的要求:第一个关键字不同而第二个相同的时候没插入到 set 里
即w相同时且u不同即插入set中。
surongr 2011-06-07
  • 打赏
  • 举报
回复
这个管用 可是我不知道为什么 set 会把 w 相同的判为一个元素
能解释下吗?
[Quote=引用 9 楼 dasama 的回复:]

C/C++ code

bool operator< (const node& rhs) const
{
if (w==rhs.w)
return u > rhs.u;
return w > rhs.w;
}



试试这个
[/Quote]
DAsama 2011-06-07
  • 打赏
  • 举报
回复

bool operator< (const node& rhs) const
{
if (w==rhs.w)
return u > rhs.u;
return w > rhs.w;
}


试试这个
surongr 2011-06-07
  • 打赏
  • 举报
回复
抱歉 别人都看明白了
[Quote=引用 7 楼 mzy1984 的回复:]

没太看明白,表达清楚点
[/Quote]
mzy1984 2011-06-07
  • 打赏
  • 举报
回复
没太看明白,表达清楚点
surongr 2011-06-07
  • 打赏
  • 举报
回复
我不想插入重复的
[Quote=引用 4 楼 namelij 的回复:]

multiset可以插入重复的
[/Quote]
surongr 2011-06-07
  • 打赏
  • 举报
回复
可是这样有点奇怪啊
我是想把 set 当优先队列用 所以重定义了 <
但是对 u 进行比较没意义啊
[Quote=引用 2 楼 dizuo 的回复:]

C/C++ code
bool operator< (const node& rhs) const
{
if (u==rhs.u)
return w > rhs.w;
return u > rhs.u;
}
[/Quote]
  • 打赏
  • 举报
回复
multiset可以插入重复的
surongr 2011-06-07
  • 打赏
  • 举报
回复
为什么和 < 这个比较符有关?
不是应该判断相等吗?
他们自己默认的 > 和 = 调用了我的 < ?

[Quote=引用 1 楼 dizuo 的回复:]

这是因为Node的比较操作符。。。
bool operator< (const node& rhs) const { return w > rhs.w; }
[/Quote]
ryfdizuo 2011-06-07
  • 打赏
  • 举报
回复
  bool operator< (const node& rhs) const 
{
if (u==rhs.u)
return w > rhs.w;
return u > rhs.u;
}

ryfdizuo 2011-06-07
  • 打赏
  • 举报
回复
这是因为Node的比较操作符。。。
bool operator< (const node& rhs) const { return w > rhs.w; }
surongr 2011-06-07
  • 打赏
  • 举报
回复
多谢各位大牛的解答
shaotine_wu 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 surongr 的回复:]

可是我试着重载了 == 和 != 都不管用
它偏偏要用 < ?
引用 11 楼 dasama 的回复:

STL进行比较两个元素是否相同时调用<操作符,这边你自己重载了<操作
根据你的要求:第一个关键字不同而第二个相同的时候没插入到 set 里
即w相同时且u不同即插入set中。
[/Quote]
因为set的默认的排序准则(或是说插入的顺序)是按照less,即operator<的仿函数来进行的。你重载其他的当然没用了。以下是set的定义
template<class T
calss Compare=less<T> //提供缺省比较准则
class Allocator=allocator<T> >
class set
如果LZ想要用自己的排序方法可以参照下面代码

#include<iostream>
#include<set>
using namespace std;
class node
{
public:
int i;
int j;
node(int i1,int j1):i(i1),j(j1){}
};
class sortCriterion
{
public:
bool operator()(const node &p1,const node &p2) //这里定义自己的排序方法
{
return p1.j<p2.j;
}
};
void main()
{
node node1(1,0),node2(2,0);
set<node,sortCriterion> set1;
set1.insert(node1);
if(set1.insert(node2).second)
{
cout<<"node2 insert success!"<<endl;
}
else
{

}

}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧