Maison >développement back-end >C++ >Garanties de sécurité des itérateurs pour les bibliothèques de conteneurs C++
La bibliothèque de conteneurs C++ fournit les mécanismes suivants pour assurer la sécurité des itérateurs : 1. Garantie d'immuabilité du conteneur ; 2. Itérateur de copie ; 3. Range for loop ; 4. Const itérateur ;
En C++, la bibliothèque de conteneurs fournit des itérateurs qui nous permettent de parcourir les éléments du conteneur. Pour éviter toute modification accidentelle du conteneur lors de l'itération, la bibliothèque de conteneurs C++ fournit plusieurs mécanismes pour assurer la sécurité des itérateurs.
1. Garantie d'immuabilité du conteneur
Lorsqu'un conteneur est dans un état valide, son contenu, sa taille et l'ordre des éléments sont déterminés. La bibliothèque de conteneurs garantit que cette invariance est maintenue pendant l'itération. L'itérateur devient invalide lorsque vous essayez d'ajouter ou de supprimer des éléments du conteneur itéré. Par exemple :
std::vector<int> v{1, 2, 3}; for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { v.push_back(4); // 迭代器无效,引用不再有效 }
2. Copie d'itérateurs
En C++, les itérateurs peuvent être copiés, créant ainsi de nouveaux itérateurs pointant vers le même élément. Cela nous permet de créer des copies des itérateurs et de continuer à les utiliser si le conteneur est modifié de manière inattendue. Les itérateurs de copie ne sont pas affectés par les modifications apportées au conteneur d'origine, même si le conteneur d'origine a changé ou a expiré.
3. Range for loop
La range for loop utilise implicitement un itérateur de copie, nous permettant de parcourir les éléments du conteneur sans craindre que les modifications apportées au conteneur affectent l'itération.
for (int& elem : v) { // 使用 elem... v.push_back(4); // 不会影响范围 for 循环 }
4. Itérateur Const
itérateur const fait référence aux éléments en lecture seule dans le conteneur. Tenter de modifier un conteneur via un itérateur const entraînera une erreur de compilation. Cela garantit l’intégrité des données lors de la traversée du conteneur.
5. Sécurité des exceptions
La bibliothèque de conteneurs détecte les exceptions pendant l'itération et invalide automatiquement l'itérateur lorsqu'une exception est levée. Cela empêche l’accès aux conteneurs corrompus.
Cas pratique : Supprimez en toute sécurité des éléments de la méthode map
std::map
是一个有序关联容器,允许我们根据键查找值。在迭代映射时,如果我们尝试删除当前迭代的元素,迭代器将失效,因为底层映射已更改。为了安全地删除元素,我们可以使用 erase
, qui renvoie un nouvel itérateur valide pointant vers le successeur de l'élément supprimé.
std::map<int, int> m{{1, 10}, {2, 20}, {3, 30}}; for (auto it = m.begin(); it != m.end(); ) { if (it->second % 2 == 0) { it = m.erase(it); // 返回新的有效迭代器 } else { ++it; } }
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!