Lors d'une itération sur un map en C , il est important de considérer le comportement de l'effacement des éléments lors de l'itération. Cette opération peut conduire à des résultats inattendus si elle n'est pas gérée correctement.
En C 11, la méthode delete() a été améliorée et est désormais cohérente sur tous les types de conteneurs. Lorsqu'un élément est effacé, la méthode Eraser() renvoie l'itérateur suivant. Cela vous permet de continuer à itérer la carte sans rencontrer de problèmes.
Le code suivant montre la bonne façon d'effacer des éléments d'une carte lors d'une itération en C 11 :
auto pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { pm_it = port_map.erase(pm_it); } else { ++pm_it; } }
En C 03, effacer des éléments d'une carte tout en l'itération peut conduire à des itérateurs invalidés. Pour éviter ce problème, vous devez parcourir la carte à l'aide d'une variable de boucle qui est incrémentée en dehors de l'opération Eraser().
Le code suivant montre la manière correcte d'effacer des éléments d'une carte lors d'une itération en C 03. :
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin(); while (pm_it != port_map.end()) { if (pm_it->second == delete_this_id) { port_map.erase(pm_it++); // Use iterator. // Note the post increment. // Increments the iterator but returns the // original value for use by erase } else { ++pm_it; // Can use pre-increment in this case // To make sure you have the efficient version } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!