2014-12-22 6 views
0

Есть ли дешевый способ изменить размер вектора V от начала, а не до конца. Таким образом, чтобы результирующий вектор W выглядит следующим образом:изменение размера вектора в cpp

V = 1,2,3,4

W = 2,3,4

Копирование является плохим решением, когда хранимые данные в векторе очень длинный. Интересно, существует ли какое-либо лучшее решение?

ответ

1

Решение использовать deque вместо vector, так как он предназначен для эффективного добавления и удалить с обоих концов.

Если по какой-то причине вы застряли с вектором, то вы также застряли в неэффективности. Ни в коем случае.

0

Если у вас есть вектор, который поддерживает движение семантики, можно использовать move_iterator создать новый вектор из старого с помощью std::move_iterator:

vector<Foo> moved_vector(std::make_move_iterator(v.begin()+1), 
         std::make_move_iterator(v.end())); 

Здесь мы предполагаем, что Foo является подвижным типом ,

Обратите внимание, что в случае POD перемещение аналогично копированию, поэтому вы ничего не сохраняете. Но, например, std::string, вышеизложенное имеет значение.

1

Нет, нет простого способа сделать это: векторы растут и сжимаются только на заднем конце. Тем не менее, если вы заключаете вектор, и вы хотите использовать только свою роль в вычислениях, вы можете сохранить смещение в вектор, и передать std::next(v.begin(), offset) вместо простого begin():

vector<int> v {1,2,3,4}; 
size_t offset = 1; 
ostream_iterator<int> out_it(std::cout,", "); 
copy(next(v.begin(), offset), v.end(), out_it); 

Demo.

проблема с этим подходом заключается в том, что память для элементов 0..offset-1 не возвращается обратно в среду исполнения.

0

Самое лучшее, что вы имеете, std::vector::erase который будет делать копию (двигаться, если это применимо) остальных элементов:

V.erase(V.begin()); 
Смежные вопросы