微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何将 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 );
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?