问题描述
我想创建按对象属性(物理大小)排序的对象链表;但到目前为止,我似乎必须自己编写代码...... 这些列表很短,通常每个都有十几个节点;但我可能有多达一千个清单;所以我负担不起使用 std::map 的额外重量。事实上,我对单链表很满意。 但我需要节点不仅仅是一个值。 我的对象中的键值很少会改变;然而,元素必须从一个列表中出来并经常移动到另一个列表。 ((实际使用:每个四边形一个列表,在四叉树中(如碰撞检测等);对象按大小排序,因为较大的对象数量较少但需要从较大的范围内快速选取,因此它们应该来自在列表中排在第一位。))
但是我发现的每个使用 std::list 维护排序列表的示例都使用整数列表作为示例;但这不是很有用;我所拥有的是具有一个值成员要排序的对象。
本来想用lower_bound找插入点,然后插入对象;但是lower_bound 迭代器将begin 和end 以及一个普通值作为第三个参数;我看不到可以指定使用对象的特定成员进行排序的机制。
当然,我可以定义一个转换运算符,
my_object_type::int(){ return sortby; }
那行得通吗?有没有更好的办法?
解决方法
我似乎在这个参考资料中找到了我的答案: https://www.geeksforgeeks.org/lower_bound-in-cpp/ 在“语法 2”下;有第四个规定 参数是一个比较函子。所以,某事 像这样应该可以工作(尚未测试):
class pnt_proxy
{
int x; //position
int y;
point* real_pnt; //the real point this represents
public:
float sz; //rough largest diagonal across object
}
class pproxy_cmp : public std::binary_function< pnt_proxy,pnt_proxy,bool >
{
public:
bool operator()( pnt_proxy const & a,pnt_proxy const & b ) const
{
return a.sz < b.sz;
}
};
std::list< pnt_proxy > ll;
void insert_sorted( pnt_proxy const & pp )
{
if( ll.size() )
{
std::list<pnt_proxy>::iterator insert_at;
insert_at =
std::lower_bound( ll.begin(),ll.end(),pp,pproxy_cmp() );
ll.insert( insert_at,pp );
}
else ll.push_back( pp );
}