替换`find_if`函数

时间:2011-08-02 19:36:54

标签: algorithm stl c++

我使用STL find_if编写了一个类方法。代码如下:

void
Simulator::CommunicateEvent (pEvent e)
{
  pwEvent we (e);
  std::list<pEvent> l;

  for (uint32_t i = 0; i < m_simulatorObjects.size (); i++)
  {
    l = m_simulatorObjects[i]->ProcessEvent (we);
    // no action needed if list is empty
    if (l.empty ())
      continue;
    // sorting needed if list comprises 2+ events
    if (l.size () != 1)
      l.sort (Event::Compare);

    std::list<pEvent>::iterator it = m_eventList.begin ();
    std::list<pEvent>::iterator jt;
    for (std::list<pEvent>::iterator returnedElementIt = l.begin ();
         returnedElementIt != l.end ();
         returnedElementIt++)
    {
      // loop through the array until you find an element whose time is just
      // greater than the time of the element we want to insert
      Simulator::m_eventTime = (*returnedElementIt)->GetTime ();
      jt = find_if (it,
                    m_eventList.end (),
                    IsJustGreater);
      m_eventList.insert (jt, *returnedElementIt);
      it = jt;
    }
  }
}

不幸的是,我后来发现运行代码的机器配备了libstdc ++库版本4.1.1-21,显然缺少find_if。毋庸置疑,我不能升级图书馆,也不能让别人去做。

编译时,我得到的错误是:

simulator.cc: In member function ‘void sim::Simulator::CommunicateEvent(sim::pEvent)’:
simulator.cc:168: error: no matching function for call to ‘find_if(std::_List_iterator<boost::shared_ptr<sim::Event> >&, std::_List_iterator<boost::shared_ptr<sim::Event> >, sim::Simulator::<anonymous struct>&)’
simulator.cc: In static member function ‘static void sim::Simulator::InsertEvent(sim::pEvent)’:
simulator.cc:191: error: no matching function for call to ‘find_if(std::_List_iterator<boost::shared_ptr<sim::Event> >&, std::_List_iterator<boost::shared_ptr<sim::Event> >, sim::Simulator::<anonymous struct>&)’
make: *** [simulator.o] Error 1

我该如何解决这个问题?

我认为我可以按照here所述定义find_if函数。但是,我有一些担忧:

  1. 表现怎么样?使用find_if的函数需要尽可能高效。
  2. 如何进行条件编译?我找不到一个告诉libstdc ++安装版本的宏。
  3. 您对此有何看法? TIA, JIR

    参考

    源文件:simulator.hsimulator.cc

    解决方案

    IsJustGreater类之外定义Simulator并宣布IsJustGreater_s的{​​{1}}朋友:

    Simulator

    以这种方式在struct IsJustGreater_s : public std::unary_function<const pEvent, bool> { inline bool operator() (const pEvent e1) {return (e1->GetTime () > Simulator::m_eventTime);} } IsJustGreater; 中调用IsJustGreater:       jt = find_if(it,m_eventList.end(),sim :: IsJustGreater);

2 个答案:

答案 0 :(得分:3)

从错误中,您似乎尝试使用匿名类型作为参数。我不认为匿名类型是模板参数。

从错误中,我相信你有这样的事情:

class Simulator {
    struct {
       bool operator(const pEvent& p) { ... } ;
    } IsJustGreater;
}

你想要的是给它一个名字,然后改变find_if来实例化这个类(见下文)

class Simulator {
    // class is now an inner named-class
    struct IsJustGreater {
        bool operator(const pEvent& p) { ... } ;
    };
}


// This is how you use the class
jt = std::find_if(it, m_eventList.end(), IsJustGreater() );

答案 1 :(得分:1)

我发现您在std::之前使用的是std::list限定符,而不是std::find_if。尝试将std::放在前面,以便编译器可以在命名空间中找到它。