Подставляя функцию `find_if` - PullRequest
       5

Подставляя функцию `find_if`

2 голосов
/ 02 августа 2011

Я написал метод класса, используя 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, как описано здесь .Тем не менее, у меня есть некоторые проблемы:

  1. А как насчет производительности?Функция, которая использует find_if, должна быть максимально эффективной.
  2. Как мне выполнить условную компиляцию?Я не смог найти макрос, сообщающий версию установленной libstdc ++.

Что вы думаете об этом?TIA, Jir

Ссылки

Исходные файлы: simulator.h и simulator.cc

Решение

Определяется IsJustGreater вне класса Simulator и объявляется IsJustGreater_s другом 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 в find_if следующим образом: jt = find_if (it, m_eventList.end (), sim :: IsJustGreater);

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Из ошибки видно, что вы пытаетесь использовать анонимный тип в качестве аргумента.Я не верю, что анонимные типы могут быть шаблонными аргументами.

Исходя из ошибки, я считаю, что у вас есть что-то вроде этого:затем измените 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 голос
/ 03 августа 2011

Я вижу, что вы используете квалификатор std:: до std::list, но не std::find_if.Попробуйте поместить std:: впереди, чтобы компилятор мог найти его в пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...