Mover iteradores para contenedores?
Los contenedores C ++ 98 definieron dos tipos de iterador,::iterator
s y::const_iterators
. En general, así:
struct vec{
iterator begin();
const_iterator begin() const;
};
En C ++ 11, esta parte del diseño parece no haber cambiado. La pregunta es,por coherencia y para fines prácticos, ¿tendría sentido agregar::move_iterator
s también? o es una exageración.
Me imagino que un contenedor de valor puede mover sus elementos si es posible.
class vec{
iterator begin() &;
const_iterator begin() const&;
move_iterator begin() &&;
};
Si entiendo correctamente, podría implementarse así en casos simples:
auto vec::begin() &&{return std::make_move_iterator(this->begin());}
Por supuesto, un iterador normal se puede convertir en un iterador de movimiento (constd::make_move_iterator
), sin embargo, la motivación es el código genérico.
Por ejemplo, con un iterador de movimiento, esto se implementaría de manera muy elegante sin condiciones dependiendo de si el argumento es un valor l o un valor r.
template<class Container, class T = Container::value_type>
void transport_first(Container&& c, std::vector<T>& v){
v.emplace_back(*std::forward<Container>(c).begin());
}
Tenga en cuenta que este código no generará copias innecesarias si es posible. ¿Cómo se puede implementar esto sinmove_iterators
generado porbegin
.
También me doy cuenta de que esta pregunta se aplica a casi cualquier accesor al contenedor, por ejemplo,operator[]
, front()
yback()
.
template<class Value>
class vec{
using value_type = Value;
using reference = Value&;
using const_reference = Value const&;
using rvalue_reference = Value&&; // NEW!
reference front() &{...}
rvalue_reference front() &&{...} // NEW!
const_reference front() const&{...}
};
Quizás los contenedores deberían haber sido rediseñados desde cero en C ++ 11. Su diseño está mostrando su edad.
Hay una propuesta para deducir automáticamente el tipo (declinar) de(*this)
básicamente tiene toda la sobrecarga correspondiente de begin (y otras funciones miembro) de forma gratuita.