gpt4 book ai didi

algorithm - 替换 `find_if` 函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:38 27 4
gpt4 key购买 nike

我使用 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

我该如何解决这个问题?

我想我可以定义一个 find_if 函数,如 here 所述.但是,我有一些顾虑:

  1. 性能如何?使用 find_if 的函数需要尽可能高效。
  2. 如何进行条件编译?我找不到告诉安装的 libstdc++ 版本的宏。

您对此有何看法?TIA,吉尔

引用资料

源文件:simulator.hsimulator.cc

解决方案

Simulator 类之外定义 IsJustGreater 并声明 SimulatorIsJustGreater_s 友元:

struct IsJustGreater_s : public std::unary_function<const pEvent, bool> {
inline bool operator() (const pEvent e1) {return (e1->GetTime () > Simulator::m_eventTime);}
} IsJustGreater;

find_if 中以这种方式调用了 IsJustGreater: jt = find_if(it, m_eventList.end(), sim::IsJustGreater);

最佳答案

从错误来看,您似乎正在尝试使用匿名类型作为参数。我不相信允许匿名类型作为模板参数。

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

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() );

关于algorithm - 替换 `find_if` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com