是时候从C++ priority_queue中弹出元素了
Time to pop element from a C++ priority_queue
我有以下问题:我正在实现一种算法,该算法本质上是执行扫描(https://en.wikipedia.org/wiki/Sweep_line_algorithm)时间以更新数据结构。对于相关的时间点,我生成适当的事件,并将其存储在std::priority_queue
中:在每个步骤中,我以最小的时间值弹出事件,对其进行处理,并在必要时将其他一些事件推送到队列中。不幸的是,我的代码运行得很慢。我使用 gprof 看了一下,似乎该算法在 std::priority_queue::pop
中花费了大约 60% 的执行时间。有没有办法提高操作效率?
编辑:循环基本上看起来像这样:
typedef std::priority_queue<Event, vector<Event>, greater<Event> > EventQueue;
while(!events.empty())
{
Event e = events.top();
events.pop();
const DirectedEdge &edge = e.current_edge->get_edge();
if(e.type == Event::LEAVING)
{
Event ee = e;
ee.type = Event::ENTERING;
++ee.current_edge;
if(!ee.current_edge)
{
ee.path->set_arrival_time(ee.time);
}
else
{
ee.current_edge->set_departure_time(ee.time);
ee.time += get_delay(ee.current_edge->get_edge());
events.push(ee);
}
}
else
{
Event ee = e;
ee.type = Event::LEAVING;
const FlowFloat time = queues[edge.get_index()].insert_traveler(e.time, e.path);
ee.time = time;
events.push(ee);
}
}
如果您使用的是符合 C++11 的编译器,请尝试将 move 构造函数/运算符添加到 Event 类中,因为 priority_queue
对元素执行大量操作,如果它可以移动而不是复制,它会快得多。这当然取决于Event
的定义方式:如果它是 POD 类型,则不会获得任何收益;如果移动运算符不比复制快任何操作,也不会获得任何好处。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- C++ queue.front();为什么不从第一个元素开始呢?
- 使用元素加载 std::queue<uint8_t*> 的更有效方法?
- 通过 std::queue 中的元素的值获取元素的索引
- 将元素推入 std::queue 时避免复制
- 我看不到从 std::queue 中获取元素的方法
- 为什么 std::queue 在弹出元素后不缩小内存?