如何将 STL std::list 与对象一起使用?

问题描述

我想创建按对象属性(物理大小)排序的对象链表;但到目前为止,我似乎必须自己编写代码...... 这些列表很短,通常每个都有十几个节点;但我可能有多达一千个清单;所以我负担不起使用 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 );
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...