当前位置: 代码迷 >> 数据结构与算法 >> 对重载了比较函数的SET容器,怎么进行高效的查询
  详细解决方案

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

热度:374   发布时间:2016-05-23 09:14:33.0
对重载了比较函数的SET容器,如何进行高效的查询
我定义了一个结构体,将结构体的指针存储在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容器中快速查找不知道这么做了。


------解决方案--------------------
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
...
}
------解决方案--------------------
的确,如果考虑时间,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*之间的比较运算 '== ', '!= ', ' < ', '> '(如果知道源码是如何实现的,就只需重载用到的就可以了,不必要全部重载)。


  相关解决方案
本站暂不开放注册!
内测阶段只得通过邀请码进行注册!
 
  • 最近登录:Sat Sep 23 09:55:29 CST 2017
  • 最近登录:Sat Sep 23 09:55:29 CST 2017
  • 最近登录:Sat Sep 23 09:55:29 CST 2017
  • 最近登录:Sat Sep 23 09:55:29 CST 2017
  • 最近登录:Sat Sep 23 09:55:29 CST 2017