Временная сложность резерва по пустому вектору в сравнении с декой и использование emplace или push_back

Я спорю, что будет быстрее, если я использую структуру данных для хранения обратных вызовов в классе, должен ли я использовать вектор и резервировать при запуске, или я должен просто использовать deque в этом случае, так как общее число подписчиков неизвестно, но будет относительно небольшим, скажем, около 15. Я предполагаю, что компромисс в этих двух сценариях распределяется каждый раз по сравнению с принятием удара, чтобы зарезервировать в моем классе.

#ifndef __Pricer_hpp__
#define __Pricer_hpp__

#include <utility>
#include <vector>

class Pricer
{
  public: 
    typedef  void (*callback_fn)(double price, void *subscription);

    Pricer(): _initialSubscriberNum(15), _callbacks() { _callbacks.reserve(_initialSubscriberNum); }  // is it better to use a deuqe and remove the need for the reserve?

    void attach (const callback_fn& fn, void *subscription )
    {
      _callbacks.emplace_back(fn,subscription); // is emplace_back better than using push_back with std::pair construction which I am assuming would do a move version of push_back?  
    }

    void broadcast(double price)
    {
      for ( auto callback : _callbacks)
      {
        (*callback.first)(price, callback.second);
      }
    }

  private:
    typedef std::pair<callback_fn, void *> _callback_t;
    const unsigned int _initialSubscriberNum;
    std::vector<_callback_t> _callbacks; // should this be a deque?
};

#endif 

1 ответ

Решение

Общее предложение заключается в использовании вектора, а затем, если у вас есть проблемы с производительностью (которые в ваших случаях, вероятно, не произойдут), перейдите на какую-то другую структуру данных.

Помните о "преждевременной оптимизации", которая иногда может навредить.

push_back против emplace_back: ссылка здесь

Другие вопросы по тегам