Lifetimes

On dispose d'une liste de comptes sous la forme d'un vecteur d'éléments de type Account dans la variable accounts. Lorsqu'on cherche à les grouper, on retourne une table de hashage (HashMap) indexée par des String et contenant des vecteurs de String, c'est-à-dire qu'une copie des données contenues dans account est effectuée. Ne pourrait-on pas faire mieux ? Tant que accounts existe, ne pourrait-on pas pointer simplement sur les chaînes de caractères contenues dans ce vecteur ?

Changement de signature de Account::group()

On souhaite changer la signature de Account::group() pour qu'elle devienne

pub fn group(accounts: &[Account]) -> HashMap<&str, Vec<&str>> { … }

ce qui correspond, en appliquant les règles d'élisions, à :

pub fn group<'a>(accounts: &'a [Account]) -> HashMap<&'a str, Vec<&'a str>> { … }

Autrement dit, les données dans la table de hashage et la table de hashage elle-même ne seront accessibles que tant que la variable accounts passée en argument de group() sera valable. Cela est garanti à la compilation et il sera impossible de s'en affranchir.

  1. Changez la définition de group() pour correspondre à celle indiquée ci-dessus ainsi que son contenu.
  2. Adaptez le programme principal pour qu'il passe une référence sur accounts à group() au lieu de consommer la variable.

Après ces modifications, plus aucune copie de chaîne n'a lieu lors de la détermination des duplicatas. Les seules copies sont des copies de références, c'est-à-dire de pointeurs assorties de tailles. De plus, le vecteur accounts initial n'a pas été consommé, juste référencé, ce qui signifie qu'on pourra faire des opérations complémentaires sur les comptes originels.