读书人

对重载了比较函数的SET容器怎么进行

发布时间: 2012-03-29 12:53:13 作者: rapoo

对重载了比较函数的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*之间的比较运算 '== ', '!= ', ' < ', '> '(如果知道源码是如何实现的,就只需重载用到的就可以了,不必要全部重载)。


读书人网 >软件架构设计

热点推荐