2014-01-19 6 views
0

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

функция перегрузка:

void pop() { 
    if(!stack.empty()) 
    stack.pop(); 
} 

void pop(int n) { 
    for(int i = 0; i < n; ++i) 
     pop(); 
} 

функция по умолчанию аргумент:

void pop(int n = 1) { 
    for(int i = 0; i < n; ++i) 
     if(!stack.empty()) 
     stack.pop(); 
} 

Есть ли разница, кроме простого кода в последнем. Есть ли преимущество при использовании первого или второго?

EDIT: изменил первый фрагмент, чтобы быть более многоразовым, путем замены цикла for с помощью функции pop.

+1

Я думаю, когда вам действительно нужно делать 'pop()', то вторая версия может быть немного медленнее, чем первая, из-за цикла for (больше кода, больше данных) ... – mb84

ответ

1

Производительность мудро: это не имеет значения. Компилятор достаточно умен, чтобы генерировать код, который эффективен в обоих случаях, для большинства приложений. Некоторые могут утверждать, что вторая версия, в случае вызова pop(), будет генерироваться дополнительный цикл for. Это может быть тривиально оптимизировано компилятором.

Что касается удобочитаемости, вторая определенно более выразительна. Но в конце концов это действительно сводится к предпочтению. Выберите тот, который, по вашему мнению, соответствует вашему дизайну, и не забудьте заранее оптимизировать его.

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