Maison > développement back-end > C++ > Utilisations abusives courantes et solutions des bibliothèques de conteneurs C++

Utilisations abusives courantes et solutions des bibliothèques de conteneurs C++

WBOY
Libérer: 2024-06-02 11:48:57
original
541 Les gens l'ont consulté

Les erreurs courantes lors d'une mauvaise utilisation des bibliothèques de conteneurs incluent la non-utilisation d'un conteneur de taille fixe (1), l'utilisation d'un itérateur hors de portée (2), l'utilisation du mauvais type de conteneur (3), la confusion des adaptateurs de conteneur avec le conteneur sous-jacent (4) et violations de propriété Règle (5). Les solutions incluent l'utilisation d'adaptateurs de liste ou de conteneur, la vérification de la validité des itérateurs ou l'utilisation de boucles basées sur des plages, la mise en correspondance des types de conteneurs et de leurs itérateurs, l'accès correct au conteneur sous-jacent via l'adaptateur de conteneur et le respect des règles de propriété de la bibliothèque de conteneurs.

C++ 容器库的常见误用和解决方案

Utilisations abusives et solutions courantes des bibliothèques de conteneurs C++

Les bibliothèques de conteneurs sont une partie importante de la bibliothèque standard C++ et sont largement utilisées pour stocker et manipuler des structures de données. Cependant, les débutants abusent souvent de ces conteneurs, ce qui entraîne des erreurs difficiles à trouver.

1. La surcharge de mémoire n'est pas prise en compte

// 错误:预先分配了比所需更多的空间
vector<int> v(1000000);
Copier après la connexion

Solution : À utiliser uniquement si un conteneur de taille fixe est requis, sinon utilisez une liste ou un adaptateur de conteneur.

// 正确:根据需要增长
list<int> v;
Copier après la connexion

2. Utilisation inappropriée des itérateurs

// 错误:在范围外访问
for (auto it = v.begin(); it != v.end(); ++it) {
  *it += 1;
  if (it == v.end()) {  // 迭代器已无效
    break;
  }
}
Copier après la connexion

Solution : Vérifiez toujours la validité des itérateurs ou utilisez une boucle for basée sur une plage.

// 正确:基于范围的 for 循环
for (int& x : v) {
  x += 1;
}
Copier après la connexion

3. Utiliser le « mauvais » type de conteneur

// 错误:对无序容器使用有序迭代器
set<int> s;
for (auto it = s.begin(); it != s.end(); ++it) {  // 有序迭代器
  *it += 1;
}
Copier après la connexion

Solution : Faites correspondre le type de conteneur et son type d'itérateur.

// 正确:无序迭代器
for (auto it = s.begin(), ie = s.end(); it != ie; ++it) {
  *it += 1;
}
Copier après la connexion

4. Confondre les adaptateurs de conteneur et les conteneurs de base

// 错误:将容器适配器与基础容器混合使用
map<int, vector<int>> m;
m[0].push_back(1);
m.find(0)->second.push_back(2);  // 错误,返回容器适配器
Copier après la connexion

Solution : Utilisez la syntaxe correcte lors de l'accès aux conteneurs de base via les adaptateurs de conteneur.

// 正确:通过容器适配器访问基础容器
m.find(0)->second.emplace_back(2);
Copier après la connexion

5. Violation des règles de propriété

// 错误:指针指向已销毁的容器中的元素
{
  vector<int> v;
  int* ptr = &v[0];
  v.pop_back();  // ptr 指向已销毁的元素
}
Copier après la connexion

Solution : Suivez les règles de propriété de la bibliothèque conteneur et assurez-vous que le pointeur pointe vers un élément valide.

// 正确:使用智能指针或引用
std::shared_ptr<int> ptr = &v[0];
Copier après la connexion

Cas pratique :

Écrire un programme pour lire un ensemble de mots dans un fichier et compter leurs occurrences. Utilisez une carte non ordonnée pour stocker les mots et leur nombre.

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

int main() {
  // 读取单词并计数出现次数
  unordered_map<string, int> word_counts;
  for (string line; getline(cin, line); ) {
    for (string word : line | views::split(" ")) {  // C++20 范围-视图
      word_counts[word]++;
    }
  }

  // 打印出现次数最多的 10 个单词
  for (auto [word, count] : word_counts | views::take(10) | views::reverse) {
    cout << word << ": " << count << '\n';
  }
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal