Por regla general, el uso de typedef o using para declarar un alias de un tipo hace exactamente lo mismo. La única ventaja que tiene utilizar using es que te permite hacer alias en templates (plantillas), mientras que typedef no, ejemplo:
Código C++:
Ver originaltemplate <typename T>
class clase_parametrizada {
T dato;
};
template <typename T>
typedef clase_parametrizada<T> un_alias; // Error en tiempo de compilación. Typedef no puede ser una plantilla.
template <typename T>
using un_alias = clase_parametrizada<T>; // Funciona perfectamente
// A partir de ahora escribir un_alias<T> es lo mismo que escribir clase_parametrizada<T>
Aparte del uso para alias que acabo de mostrarte using también sirve para definiciones y declaraciones de namespaces como el clásico using namespace std; y también tiene usos interesantes en cuestiones de herencia, pero eso mejor lo dejamos para más adelante