急!如何在set中快速查找符合某一个条件的元素

jackymann 2007-03-29 06:52:49
我定义了一个set:
set<Item *> children;
items中有一些元素。item的定义如下:
class Item
{
public:
Item(int newId, int newSupport){id=newId; support=newSupport;next=0; parent=0;}
~Item(){}
void addChild(Item *item) {children.insert(item);}
int id; //节点id。
int support; //结点支持度
Item *next; //指针链上的下一个节点。
Item *parent; //父节点。
set<Item *> children; //子结点的集合。

};
我想在children中快速的查找id和我所指定的id相等的item,请问该如何实现呢?因为children中存的是Item的指针,而不是Item本身,不知道除了手工便利children,一个一个的比较以外,有没有直接用find()或find_if()实现的方法?
...全文
1062 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ytfhwfnh 2007-03-30
  • 打赏
  • 举报
回复
建议使用hash_map<int, Item *> children;
dexo 2007-03-30
  • 打赏
  • 举报
回复
看你这数据结构设计感觉是乱七八糟,可能是你的特殊需求吧,

set插入的时候本身已经是排序的了,不要调用通用的find or find_if算法,
一定要直接调用set的find算法,效率才会高,
感觉你的数据解构是item组成的树,每个接点的子接点是set<item>
查找必须一层一层遍历,那用set有什么用,要不就是你没说清楚,要不你的数据结构设计不合理。

用set的find算法最后一个参数是传值(set容器保存的值)-item类型的,跟你根据id查找有矛盾,可以有2个变通的办法:
1.把你的构造函数改为Item(int id),这样调用set成员函数find的时候,生成了一个Item(id)的对象,
2.查找的时候构造一个Item(int id,“”)的对象,再调用set的find成员函数。

h9999h 2007-03-30
  • 打赏
  • 举报
回复
set本身是排序的
在定义children时加个自定义排序准则,
template < class T, class Compare = less<T> ,class Allocator = allocator<T> >
就是定义上面的Compare对应的排序类,以Item中的ID作为排序准则。

set中的find对算法进行了优化,就是要使用它。


taodm 2007-03-29
  • 打赏
  • 举报
回复
id是你的item的唯一key值吗?
bladeIII 2007-03-29
  • 打赏
  • 举报
回复
需要提高查找的效率就不要使用set,使用关联容器。
zengkun100 2007-03-29
  • 打赏
  • 举报
回复
难道你认为find和find_if不是一个一个地比较的吗?去看看STL的源代码。
jackymann 2007-03-29
  • 打赏
  • 举报
回复
能说得详细一点吗?万分感谢!
0黄瓜0 2007-03-29
  • 打赏
  • 举报
回复
可以自定义数据结构:既不会加入重复的指针,又按指针指向的数据的id字段对指针排序.
0黄瓜0 2007-03-29
  • 打赏
  • 举报
回复
查找快速的前提是:数据有序.
如果你的数据不按id排序,只有一个个的比较,不能快速.

64,691

社区成员

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

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