Maison  >  Article  >  développement back-end  >  Garanties de sécurité des itérateurs pour les bibliothèques de conteneurs C++

Garanties de sécurité des itérateurs pour les bibliothèques de conteneurs C++

WBOY
WBOYoriginal
2024-06-05 16:07:02816parcourir

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 ;

C++ 容器库的迭代器安全性的保证

Garantie de la sécurité des itérateurs dans la bibliothèque de conteneurs C++

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn