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!
所以,我在想:
- 不使用
emplace
方法,而是使用push
(也许推送不会创建新对象)
- 将
priority_queue
更改为,而不是让对象向量 std::vector<Obj>
具有共享指针向量,这样我就可以访问它在其中的 Obj
来自外面的 priority_queue
.. 如上所示。
问题:
你认为这是个好主意吗?我是 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
界面执行此操作的唯一方法是从队列中删除元素,更改它,然后重新添加它。
我的 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!
所以,我在想:
- 不使用
emplace
方法,而是使用push
(也许推送不会创建新对象) - 将
priority_queue
更改为,而不是让对象向量std::vector<Obj>
具有共享指针向量,这样我就可以访问它在其中的Obj
来自外面的priority_queue
.. 如上所示。
问题:
你认为这是个好主意吗?我是 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
界面执行此操作的唯一方法是从队列中删除元素,更改它,然后重新添加它。