是时候从C ++ priority_queue中弹出元素了

时间:2014-04-07 09:24:50

标签: c++ performance algorithm 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);
  }
}

1 个答案:

答案 0 :(得分:1)

如果您使用的是兼容C ++ 11的编译器,请尝试向Event类添加移动构造函数/运算符,因为priority_queue对元素执行了大量操作,如果它可以移动而不是复制它会快得多。这当然取决于Event的定义方式:如果它是POD类型,你就不会获得任何东西;如果移动操作员没有比复制更快的事情,也没有收获。