2009-09-23 8 views
5

Можно ли передать право собственности на векторное содержимое из одного вектора в другой?Передача права собственности в контейнерах STL?

vector<T> v1; 
// fill v1 
vector<T> v2 = OvertakeContents(v1); 
// now v1 would be empty and v2 would have all the contents of v1 

Это возможно для списков с функцией сращивания. Это должно быть возможно в постоянное время для всего вектора.

Если это не так, почему бы и нет?

+2

сторона примечание: «своп» уже упоминалось. Но я хотел бы добавить, что в C++ 0x вы можете просто заменить «OvertakeContents» на «std :: move», и он будет делать то, что вы хотите. – sellibitze

ответ

10

Заканчивать станд :: своп

vector<T> v1; 
// fill v1 

vector<T> v2; 

swap(v1, v2); 
OR 
v2.swap(v1); 

Swap Reference

+1

Ваше примечание полностью неверно: все контейнеры STL обеспечивают эквивалентную перегрузку std :: swap (a, b) с той же семантикой, что и a.swap (b) –

+0

@Greg. Спасибо, что указали на ошибку в моей заметке. Посмотрев ссылку на Vector.swap, они действительно имеют одинаковую семантику. –

10

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

vector<T> v2; 
v2.swap(v1); 
+0

Я почти поддержал вас, однако, ваш код синтаксически ошибочен. – avakar

+0

@avakar: Вы правы. Исправленный. –

0

Здесь есть две точки:

1) для любого типа Назначаемые, своп может быть определен в терминах задания. Это требует трех назначений, каждый из которых для типа контейнера является линейным по размеру контейнера. В некотором смысле, a.swap (b) является избыточным. Он существует исключительно ради эффективности: для многих контейнеров, таких как вектор и список, можно реализовать swap таким образом, чтобы его временная сложность была постоянной, а не линейной. Если это возможно для некоторого типа контейнера X, тогда обмен swap шаблона (X &, X &) можно просто записать в терминах X :: swap (X &). Следствием этого является то, что X :: swap (X &) должен быть определен только в том случае, если существует такая реализация с постоянным временем. Не каждый контейнерный класс X должен иметь такую ​​функцию-член, но если функция-член существует вообще, то гарантируется, что будет амортизировано постоянное время.

2) если вам нужен другой контейнер, который имеет те же элементы, для которых вы хотели передать собственности Пожалуйста, создать простую копию для повышения эффективности

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