【问题标题】:How do I use STL std::list with objects?如何将 STL std::list 与对象一起使用?
【发布时间】:2021-06-25 14:04:10
【问题描述】:

我想创建按对象属性(物理大小)排序的对象链接列表;但到目前为止,我似乎必须自己编写代码...... 这些列表很短,通常每个都有十几个节点;但我可能有多达一千个列表;所以我负担不起使用 std::map 的额外重量。事实上,我对单链表很满意。 但我需要节点不仅仅是一个值。 我的对象中的关键值很少会改变;然而,元素必须从一个列表中出来并经常移动到另一个列表中。 ((实际使用:一个四边形一个列表,在四叉树中(如碰撞检测等);对象按大小排序,因为较大的对象数量较少但需要从较大的范围内快速挑选,所以它们应该来在列表中排名第一。))

但是我发现的每个使用 std::list 维护排序列表的示例都使用整数列表作为示例;但这不是很有用;我所拥有的是具有一个值成员进行排序的对象。 我正在考虑使用lower_bound找到插入点,然后插入对象;但是 lower_bound 迭代器需要一个开始、结束和一个普通值作为第三个参数;我看不到可以指定使用对象的特定成员进行排序的机制。 当然,我可以定义一个转换运算符, my_object_type::int(){ return sortby; } 那行得通吗?有没有更好的办法?

【问题讨论】:

    标签: key-value stdlist lower-bound


    【解决方案1】:

    我似乎在这个参考资料中找到了我的答案: 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 );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 2021-08-29
      • 2013-10-25
      • 2011-10-19
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多