2013-05-26 4 views
2

У меня есть класс, который иногда должен использовать элемент типа deque<int>, если аргумент передается конструктору, а если нет, то этот элемент не будет использоваться. Каков наилучший способ справиться с этой ситуацией эффективно и стилистически?Пустой deque против неиспользуемого указателя на deque

Я хотел бы также упомянуть, что объекты этого класса должны быть переданы в одну и ту же функцию, хотя удаление возможности хранения в одном контейнере прекрасное. Я никогда не делал полиморфизма (как намекнул в комментариях), но я думаю, что собираюсь прочитать об этом и попробовать.

Мои две идеи:
- Держите переменную-член как deque<int>, который будет храниться в виде пустой deque<int> я полагаю.
- Используйте указатель на deque<int>, позвонив по телефону new, если это необходимо.

+1

Если вы не делаете тонны этих вещей, держите вещи простыми. Не оптимизируйте, прежде чем у вас появятся требования. Убедиться, что код работает и его легко понять, это самое главное. Другими словами, просто сделайте это и не используйте, если вам это не нужно. – xaxxon

+0

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

+0

Мне также нравится иметь красивый код :) – user904963

ответ

0

Вы также можете установить указатель на DEQUE элемента при его инициализации для использования:

deque<int> queue_; 
deque<int> *ptr_; 

ptr_(NULL); // not used 

ptr_(&queue_); 

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

0

Если производительность является проблемой, я бы, вероятно, использовать вариант 1 вместе с «is_initialized» логический флаг:

class A 
{ 
    bool is_initialized;  
    public: 
    A(bool used=false):is_initialized(used) 
    { 
    }; 
    private: 
    deque<int> _d; 
}; 

Да, вы можете быть в состоянии сохранить немного памяти с вариантом 2, когда DEQUE не используется, но если он используется, вы получаете накладные расходы на разыменование указателя.

0

То, что вы ищете, это точно boost::optional<deque<int>>. Ничто иное не документирует ваше намерение более четко и правильно здесь.

Смежные вопросы