Básicamente, usted está pidiendo lo que sucede cuando se hace lo siguiente:
vector<int> v;
v.reserve(100);
Podemos mirar a lo libstdC++ hace en este caso como un example.
template<typename _Tp, typename _Alloc> void vector<_Tp, _Alloc>::reserve(size_type __n) {
if (__n > this->max_size())
__throw_length_error(__N("vector::reserve"));
if (this->capacity() >= __n)
return;
const size_type __old_size = size();
pointer __tmp = _M_allocate_and_copy(__n,
_GLIBCXX_MAKE_MOVE_ITERATOR(this->_M_impl._M_start),
_GLIBCXX_MAKE_MOVE_ITERATOR(this->_M_impl._M_finish));
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage - this->_M_impl._M_start);
this->_M_impl._M_start = __tmp;
this->_M_impl._M_finish = __tmp + __old_size;
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
}
La llamada importante aquí es _M_allocate_and_copy
template<typename _ForwardIterator> pointer _M_allocate_and_copy(size_type __n, _ForwardIterator __first, _ForwardIterator __last) {
pointer __result = this->_M_allocate(__n);
std::__uninitialized_copy_a(__first, __last, __result, _M_get_Tp_allocator());
return __result;
}
La llamada importante aquí es std::__uninitialized_copy_a
template<typename _InputIterator, typename _ForwardIterator, typename _Allocator> _ForwardIterator __uninitialized_copy_a(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _Allocator& __alloc) {
_ForwardIterator __cur = __result;
for (; __first != __last; ++__first, ++__cur)
__alloc.construct(&*__cur, *__first);
return __cur;
}
Esto está llamando construct. Como puede ver, está usando el constructor de copia.
void construct (pointer p, const_reference val) {
new ((void*)p) T (val);
}
Por lo tanto, cuando un reallocate sucede, cada elemento en el vector tiene el constructor de copia invocado.
Podría dar la definición de función para su función de intercambio? No se podría haber encontrado a través de ADL/Koenig (argumento de búsqueda-dependiente). Además, son los elementos de su tipo de datos que se intercambian, o es el vector ? de los elementos que se intercambia – zarkon
se añade el código como una edición que esperaba elementos del vector que pueden intercambiar alguna manera durante el cambio de tamaño para evitar la copia profunda los encabezados STL son bien ofuscado, pero creo que hay un camino desde std..: :.. :: vector de cambiar el tamaño de algunas de intercambio llamando a la función –
Creo que este es un problema de la calidad de la ejecución, y algo que no se puede aprovechar de forma portátil – visitor