Удалить первые N элементов из std :: vector - PullRequest
24 голосов
/ 08 сентября 2011

Я не могу придумать надежного способа (который также сжимает память) для удаления первых N элементов из std::vector.Как можно это сделать?

Ответы [ 3 ]

35 голосов
/ 08 сентября 2011

Поскольку вы упоминаете, что хотите сжать память, было бы лучше скопировать все в новый вектор и использовать идиому подкачки.

std::vector<decltype(myvector)::value_type>(myvector.begin()+N, myvector.end()).swap(myvector);
28 голосов
/ 08 сентября 2011

Используйте метод .erase():

// Remove the first N elements, and shift everything else down by N indices
myvec.erase(myvec.begin(), myvec.begin() + N);

Это потребует копирования всех элементов из индексов N + 1 до конца. Если у вас большой вектор и вы будете делать это часто, используйте взамен std::deque, что обеспечивает более эффективную реализацию удаления элементов спереди.

10 голосов
/ 08 сентября 2011
v.erase( v.begin(), v.size() > N ?  v.begin() + N : v.end() );

Не забудьте проверить размер, на всякий случай.

...