Временная сложность резерва по пустому вектору в сравнении с декой и использование 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: ссылка здесь