2012-04-17 2 views
4

Как вы resize a std::deque от перед вместо спины?deque.resize() с фронта * *?

(Да, конечно, я могу push_front фиктивное значение тысячи раз, но есть лучший/более эффективный способ?)

ответ

8

Существует перегрузка insert, которая вставляет N элементов:

std::deque<int> c; 

std::size_t new_size = get_new_desired_size(); 

c.insert(c.begin(), new_size - c.size(), int()); 

(Этот пример требует, чтобы new_size >= c.size())

+0

Почему это более эффективно, чем создание 'new_size' раз' push_front() '? –

+0

Что делать, если s.size()> new_size? – zyndor

+1

@ RafałRawicki: Это будет не менее эффективно, но если реализация умна, это может быть лучше (у deque есть итераторы с произвольным доступом, поэтому вы можете легко получить счет). –

1

более полное решение:

std::deque<T> deque; 
std::size_t new_size = /* ... */; 
if (new_size >= deque.size()) 
    deque.insert(deque.begin(), new_size - deque.size(), T()); 
else 
    deque.erase(deque.begin(), deque.begin() + deque.size() - new_size); 

В связи с характером std::deque все оставшихся итераторов должны оставаться в силе в любом случае.

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