C++11 - 如何将 priority_queue 与共享指针向量一起使用?

C++11 - How to use a priority_queue with a vector of shared pointers?

我的 class 里面有一个 priority queue,像这样:

    class Foo
    {
    public:
        //public methods...
    private:
        std::priority_queue<Obj, std::vector<Obj>, object_less> foo_queue;

        //private methods and members...
    }

我一直在使用 emplace() 方法在我的 priority_queue 中插入对象,如下所示:

void Foo::add( ... ) {
    foo_queue.emplace(var1, var2);
}

这将调用 Obj(var1,var2) 的构造函数并将其插入到 priority queue.

但是现在,我需要从外部访问 std::vector<Obj>。来自我的 Obj 个对象。

类似于创建 Foo object 和更改 priority_queue 对象内的成员:

Foo myFoo; // <-- this is where the priority_queue is!

Obj myObj(1); //Creating an object that has some member with value '1'

myFoo.add(myObj); //This will add the object to the priority_queue via emplace (actually it is creating a new object...and not using that one)

myObj.m_member = 2; //HERE WON'T WORK!!! And now I want to change some value on my Obj to '2'. It won't work, because the object that lives inside the priority_queue is different from this one!

所以,我在想:

问题:

你认为这是个好主意吗?我是 smart_pointers 的新手。我不知道是否有更简单的解决方案。

如何将 priority_queue 与向量 shared_pointers 一起使用? 有人知道我可以遵循的简单示例吗?

像这样:

std::priority_queue<std::shared_ptr<Obj>, std::vector<std::shared_ptr<Obj>>, object_less> foo_queue;

然后希望我可以执行:

Foo myFoo;
Obj myObj(1);
myFoo.add(myObj);
myObj.m_member = 2; //<--Now the m_member should be 2 inside the priority_queue.. is this "possible"?

shared_ptrs 的优先级队列没有错。您需要注意的一件事是比较。 priority_queue 当然需要比较,默认情况下它使用 operator <。但是那个运算符在 shared_ptrs 上比较指针本身而不是指向的对象。您需要将自定义比较器传递给对对象本身进行操作的优先级队列。幸运的是,您似乎已经在使用自定义比较器,因此如果您忘记这样做,编译器会对您大吼大叫(尽管错误消息可能 exceedingly 神秘)。

另一个警告:如果您以影响其在优先级队列中排序的方式修改对象,出错。通过 priority_queue 界面执行此操作的唯一方法是从队列中删除元素,更改它,然后重新添加它。