对重载了比较函数的SET容器,如何进行高效的查询

lingfengyang 2007-06-12 01:53:28
我定义了一个结构体,将结构体的指针存储在SET容器中,并重载了SET的比较函数。
struct link_struct
{
int link_id;
int link_cost;
……
}
class link_compare
{
public:
bool link_compare::operator() (cost link_struct* first_link, cost link_struct* second_link)
{
return(first_link->link_id < second_link->link_id);
}
}
std::set<link_struct* , link_compare> set_link;

这样可以将一个结构体存入在set容器,并按照我想要的方式排序。

但目前碰到一个问题,进行快速查找好像没有办法,如上例,在SET容器中是按照结构体中link_id进行排序,如果输入一个link_id,在set容器中快速查找不知道这么做了。
...全文
1229 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
medie2005 2007-06-14
  • 打赏
  • 举报
回复
的确,如果考虑时间,mathe说的有理。

又想了想,其实用set实现好象也不困难。

只需要将查询语句上做点“手脚”:
std::set<link_struct* , link_compare>::iterator it=set_link.find(id);
if(it!=set_link.end()){//Find
}

===>

link_struct temp;
temp.link_id=id;
std::set<link_struct* , link_compare>::iterator it=set_link.find(&temp);
if(it!=set_link.end()){//Find
}

还需要重载link_struct*与link_struct*之间的比较运算'==','!=','<','>'(如果知道源码是如何实现的,就只需重载用到的就可以了,不必要全部重载)。


mathe 2007-06-14
  • 打赏
  • 举报
回复
我倒是觉得用指针比直接用结构体进去效率高(代码效率高),可以避免很多对象之间的拷贝;当然,自己维护起来麻烦一些(需要自己new/delete对象)。
lingfengyang 2007-06-14
  • 打赏
  • 举报
回复
明白了,谢谢mathe和medie2005(阿诺)
mathe 2007-06-14
  • 打赏
  • 举报
回复
这种取巧的方法是可以使用的(不需要重载操作符,上面已经定义过一个link_compare函数,足够了),就是使用的时候有点怪,最好还是自己重新封装一下。
medie2005 2007-06-13
  • 打赏
  • 举报
回复
map迭代子的自增(自减),得到的是按排序的上一个(下一个)。

这也是理所当然的。如果不是这样的话,map迭代子的自增又能指向什么?

另外:

set容器只能存一个类型数值,要存储一个对象,不用指针用什么呢?怎么才是直接存储不浪费呢?
================================================

就是可以直接用结构体存进去。只不过要提供结构体之间的比较函数而已。

如果觉得这样不伦不类,将结构体改写成类就OK了。
mathe 2007-06-13
  • 打赏
  • 举报
回复
你应该用map<int, link_struct *>而不是用set
lingfengyang 2007-06-13
  • 打赏
  • 举报
回复
map提供排序功能吗?不好意思,我孤陋寡闻啊,实验一下先。
另外哪里有提到呢?
lingfengyang 2007-06-13
  • 打赏
  • 举报
回复
哈哈,我居然问出这样一个问题:“shan_ghost()是什么方法?”我之前还以为shan_ghost()是容器的一种什么没见过的方法呢,没意识到是个ID。

该打该打,向shan_ghost()道歉 :)
mathe 2007-06-13
  • 打赏
  • 举报
回复
map为什么不能用于排序呢?
set需要的功能map也全部提供了呀?
map<int, link_struct *> the_map;
the_map[s->link_id]=s;
....

for(it=the_map.begin();it!=the_map.end();++it){
link_struct *p=it->second;//Now visit all nodes in order
...
}
lingfengyang 2007-06-13
  • 打赏
  • 举报
回复
关于用set还是map,我已经回复mathe()了,这里再解释一下:

有两个需求:1、首先是排序(这是重点);2、再是查找。
两个功能都需要,最简单的方法是用两个容器set和map来实现,但存在内存释放的协调问题等等(当然不是不可以解决)。
但我现在想在一个容器内解决,所以存在了题目所列出的问题。


呵呵,我就是不知道该如何重载这个find函数,所以请教啊。能否指点一二。
medie2005 2007-06-13
  • 打赏
  • 举报
回复
所以说,不应该用Set,应该用map。

shan_ghost()是什么方法?

重载啊。

找到find函数,看一看源码,不就知道要重载什么了嘛。
lingfengyang 2007-06-13
  • 打赏
  • 举报
回复
唉,我要在容器中存的又不是一个值,而是一个对象,容器排序的标准是对象的一个属性。
set容器只能存一个类型数值,要存储一个对象,不用指针用什么呢?怎么才是直接存储不浪费呢?

另外,shan_ghost()是什么方法?
medie2005 2007-06-13
  • 打赏
  • 举报
回复
既然用的是容器,楼主为什么只存指针?容器就是用来存的,楼主这样间接存储,很浪费。

方法shan_ghost() 已经说了。

lingfengyang 2007-06-13
  • 打赏
  • 举报
回复
回楼上,可是我需要排序。
lingfengyang 2007-06-12
  • 打赏
  • 举报
回复
楼上的兄弟能否给一具体的操作方法呢?
shan_ghost 2007-06-12
  • 打赏
  • 举报
回复
重载link_struct*和int的所有比较操作运算符;或者跟踪find函数,看它用到了哪些比较操作,仅重载它所用到的那些比较运算符。

前者工作量有点大,后者不具可移植性
lingfengyang 2007-06-12
  • 打赏
  • 举报
回复
呵呵,我也知道有find函数,因为我构建的是std::set<link_struct* , link_compare>
set容器里存的是结构体link_struct的指针,所以set的find函数只能查这个指针。
不知道我的解释楼上的清楚没?
mathe 2007-06-12
  • 打赏
  • 举报
回复
std::set<link_struct* , link_compare>::iterator it=set_link.find(link_id);
if(it!=set_link.end()){//Find
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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